环境:SpringBoot3.2.5
1. 获取进程ID
如果你想在程序中获取当前SpringBoot运行的进程号,那么你可以使用ApplicationPid,该类非常方便的获取当前进程ID。
1 2 3
| ApplicationPid pid = new ApplicationPid() System.out.printf("进程ID: %s%n", pid.toString()) 1.2.
|
输出结果:
当然你还可以通过如下方式,获取当前的进程号:
1 2 3 4
| org.springframework.context.ApplicationListener=\ org.springframework.boot.context.ApplicationPidFileWriter 1.2.3.
|
该监听器会将当前的进程ID写入文件中,通过如下配置文件路径
1 2 3 4
| spring: pid: file: d:/app.pid 1.2.3.
|
还可以通过如下方式:
1 2
| String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0] 1.
|
这样也可以获取进程ID。
2. 应用运行主目录
ApplicationHome提供访问应用程序主目录的途径。尝试为Jar文件、解压缩文件和直接运行的应用程序选择一个合理的主目录。
1 2 3
| ApplicationHome home = new ApplicationHome() ; System.out.printf("dir: %s, source: %s%n", home.getDir(), home.getSource()) ; 1.2.
|
在IDE中运行输出结果:
1 2
| dir: D:\java\workspace\test-app, source: null 1.
|
打成Jar后运行输出结果:
1 2 3
| dir: D:\java\workspace\test-app\target, source: D:\java\workspace\test-app\target\test-app-1.0.0.jar 1.2.
|
通过jar运行后,source输出的是当前运行的jar包路径。
3. 获取Java版本
要想知道当前SpringBoot运行时的java版本可以通过JavaVersion获取:
1 2
| System.out.printf("Java Version: %s%n", JavaVersion.getJavaVersion()) ; 1.
|
输出结果:
JavaVersion是个枚举类,定义了17~22枚举值,你还可以调用isEqualOrNewerThan和isOlderThan进行java版本的比较。
4. 应用临时目录
ApplicationTemp类提供了访问应用程序特定的临时目录的功能。一般来说,不同的Spring Boot应用程序将得到不同的位置,但是,只需重新启动应用程序即可获得相同的位置。
1 2 3
| ApplicationTemp temp = new ApplicationTemp() System.out.printf("临时目录: %s%n", temp.getDir()) 1.2.
|
输出结果:
1 2
| 临时目录: C:\Users\MSI-NB\AppData\Local\Temp\561929B2C764E67BCDA2DF9DAE26EF121F7E5365 1.
|
不论你在IDE下还是Jar方式运行,windows平台下临时目录都在这里的Temp下。
5. 系统属性/环境变量访问
当你需要访问系统属性时可以通过SystemProperties类非常方便的获取。如果你访问的属性不存在时(null),那么它会再从环境变量中获取(System#getenv)。
1 2
| System.out.printf("java.home=%s%n", SystemProperties.get("java.home")) ; 1.
|
输出结果:
1 2
| java.home=D:\software\jre 1.
|
注:这里的get方法参数是可变长参数,你可以传递多个key,获取时遍历遇到不为null的直接返回。
6. 实例化对象
Instantiator通过注入可用参数来实例化对象的简单工厂。
1 2 3 4
| public interface DAO {} public class A implements DAO {} public class B implements DAO {} 1.2.3.
|
注备上面几个类,接下通过Instantiator一次性实例化多个对象。
1 2 3 4
| 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) 1.2.3.
|
输出结果
1 2
| [com.pack.A@3127cb44, com.pack.B@3234474] 1.
|
非常方便的一次性帮助你实例化多个同类型的类。
7. 资源加载
如果你想将后缀为.properties,.xml,.yaml资源文件加载,那么你可以使用PropertiesPropertySourceLoader与YamlPropertySourceLoader。
1 2 3 4 5 6 7 8 9
| // 加载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()) 1.2.3.4.5.6.7.8.
|
通过上面2个Loader非常方便的将资源文件加载,加载后的List还可以注册到Environment中,在系统中直接访问。
8. 获取basePackages
如果你需要在代码中获取当前应用启动类所在的基包basePackages,那么你可以通过如下方式:
1 2 3
| private ConfigurableApplicationContext context ; System.out.printf("basepPckages: %s%n", AutoConfigurationPackages.get(context)) ; 1.2.
|
输出结果:
1 2
| basepPckages: [com.pack] 1.
|
内部注册的是一个BasePackages Bean,该类是静态私有的所以你没法直接访问,只能通过上面的方式。