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