SpringBoot這幾個(gè)工具類太有用了
環(huán)境:SpringBoot3.2.5
1. 獲取進(jìn)程ID
如果你想在程序中獲取當(dāng)前SpringBoot運(yùn)行的進(jìn)程號(hào),那么你可以使用ApplicationPid,該類非常方便的獲取當(dāng)前進(jìn)程ID。
ApplicationPid pid = new ApplicationPid() ;
System.out.printf("進(jìn)程ID: %s%n", pid.toString()) ;輸出結(jié)果:
進(jìn)程ID: 24416當(dāng)然你還可以通過如下方式,獲取當(dāng)前的進(jìn)程號(hào):
#在META-INF/spring.factories中注冊監(jiān)聽器
org.springframework.context.ApplicationListener=\
org.springframework.boot.context.ApplicationPidFileWriter該監(jiān)聽器會(huì)將當(dāng)前的進(jìn)程ID寫入文件中,通過如下配置文件路徑
spring:
pid:
file: d:/app.pid文件內(nèi)容:
圖片
如果你覺得無聊,那么你還可以通過如下方式:
String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0]這樣也可以獲取進(jìn)程ID。
2. 應(yīng)用運(yùn)行主目錄
ApplicationHome提供訪問應(yīng)用程序主目錄的途徑。嘗試為Jar文件、解壓縮文件和直接運(yùn)行的應(yīng)用程序選擇一個(gè)合理的主目錄。
ApplicationHome home = new ApplicationHome() ;
System.out.printf("dir: %s, source: %s%n", home.getDir(), home.getSource()) ;在IDE中運(yùn)行輸出結(jié)果:
dir: D:\java\workspace\test-app, source: null打成Jar后運(yùn)行輸出結(jié)果:
dir: D:\java\workspace\test-app\target,
source: D:\java\workspace\test-app\target\test-app-1.0.0.jar通過jar運(yùn)行后,source輸出的是當(dāng)前運(yùn)行的jar包路徑。
3. 獲取Java版本
要想知道當(dāng)前SpringBoot運(yùn)行時(shí)的java版本可以通過JavaVersion獲?。?/p>
System.out.printf("Java Version: %s%n", JavaVersion.getJavaVersion()) ;輸出結(jié)果:
Java Version: 17JavaVersion是個(gè)枚舉類,定義了17~22枚舉值,你還可以調(diào)用isEqualOrNewerThan和isOlderThan進(jìn)行java版本的比較。
4. 應(yīng)用臨時(shí)目錄
ApplicationTemp類提供了訪問應(yīng)用程序特定的臨時(shí)目錄的功能。一般來說,不同的Spring Boot應(yīng)用程序?qū)⒌玫讲煌奈恢?,但是,只需重新啟?dòng)應(yīng)用程序即可獲得相同的位置。
ApplicationTemp temp = new ApplicationTemp() ;
System.out.printf("臨時(shí)目錄: %s%n", temp.getDir()) ;輸出結(jié)果:
臨時(shí)目錄: C:\Users\MSI-NB\AppData\Local\Temp\561929B2C764E67BCDA2DF9DAE26EF121F7E5365不論你在IDE下還是Jar方式運(yùn)行,windows平臺(tái)下臨時(shí)目錄都在這里的Temp下。
5. 系統(tǒng)屬性/環(huán)境變量訪問
當(dāng)你需要訪問系統(tǒng)屬性時(shí)可以通過SystemProperties類非常方便的獲取。如果你訪問的屬性不存在時(shí)(null),那么它會(huì)再從環(huán)境變量中獲取(System#getenv)。
System.out.printf("java.home=%s%n", SystemProperties.get("java.home")) ;輸出結(jié)果:
java.home=D:\software\jre注:這里的get方法參數(shù)是可變長參數(shù),你可以傳遞多個(gè)key,獲取時(shí)遍歷遇到不為null的直接返回。
6. 實(shí)例化對(duì)象
Instantiator通過注入可用參數(shù)來實(shí)例化對(duì)象的簡單工廠。
public interface DAO {}
public class A implements DAO {}
public class B implements DAO {}注備上面幾個(gè)類,接下通過Instantiator一次性實(shí)例化多個(gè)對(duì)象。
Instantiator<DAO> instant = new Instantiator<>(DAO.class, p -> {}) ;
List<DAO> ret = instant.instantiate(List.of("com.pack.A", "com.pack.B")) ;
System.out.printf("%s%n", ret) ;輸出結(jié)果
[com.pack.A@3127cb44, com.pack.B@3234474]非常方便的一次性幫助你實(shí)例化多個(gè)同類型的類。
7. 資源加載
如果你想將后綴為.properties,.xml,.yaml資源文件加載,那么你可以使用PropertiesPropertySourceLoader與YamlPropertySourceLoader。
// 加載properties文件
PropertiesPropertySourceLoader propertyLoader = new PropertiesPropertySourceLoader() ;
List<PropertySource<?>> list = propertyLoader.load("pack", new ClassPathResource("pack.properties")) ;
System.out.printf("pack.*: %s%n", list.get(0).getSource()) ;
// 加載yaml文件
YamlPropertySourceLoader yamlLoader = new YamlPropertySourceLoader() ;
List<PropertySource<?>> yamls = yamlLoader.load("pack", new ClassPathResource("pack.yml")) ;
System.out.printf("pack.*: %s%n", yamls.get(0).getSource()) ;通過上面2個(gè)Loader非常方便的將資源文件加載,加載后的List<PropertySource>還可以注冊到Environment中,在系統(tǒng)中直接訪問。
8. 獲取basePackages
如果你需要在代碼中獲取當(dāng)前應(yīng)用啟動(dòng)類所在的基包basePackages,那么你可以通過如下方式:
private ConfigurableApplicationContext context ;
System.out.printf("basepPckages: %s%n", AutoConfigurationPackages.get(context)) ;輸出結(jié)果:
basepPckages: [com.pack]內(nèi)部注冊的是一個(gè)BasePackages Bean,該類是靜態(tài)私有的所以你沒法直接訪問,只能通過上面的方式。

































