一、获取进程ID
如果我们想在程序中获取当前SpringBoot运行的进程号,我们可以使用ApplicationPid。
package com.example.ruituodemo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.system.ApplicationPid;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class RuituoDemoApplicationTests {
@Test
void contextLoads() {
ApplicationPid pid = new ApplicationPid();
System.out.println("进程ID:" + pid);
}
}
输出结果:
进程ID:6908
二、获取应用运行主目录
ApplicationHome提供访问应用程序主目录的途径。尝试为Jar文件、解压缩文件和直接运行的应用程序选择一个合理的主目录。
package com.example.ruituodemo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.system.ApplicationHome;
import org.springframework.boot.system.ApplicationPid;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class RuituoDemoApplicationTests {
@Test
void contextLoads() {
ApplicationHome home = new ApplicationHome();
System.out.printf("dir:%s,source:%s", home.getDir(), home.getSource());
}
}
输出结果:
dir:D:\javaLearn\ruituoDemo,source:null
打成Jar后运行输出结果
dir:D:\javaLearn\ruituoDemo\target,source:D:\javaLearn\ruituoDemo\target\ruituoDemo-0.0.1-SNAPSHOT.jar
三、获取Java版本
要想知道当前SpringBoot运行时的java版本可以通过JavaVersion获取
package com.example.ruituodemo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.system.JavaVersion;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class RuituoDemoApplicationTests {
@Test
void contextLoads() {
System.out.printf("Java version:%s", JavaVersion.getJavaVersion());
}
}
输出结果:
Java version:17
四、应用临时目录
ApplicationTemp类提供了访问应用程序特定的临时目录的功能。一般来说,不同的Spring Boot应用程序将得到不同的位置,但是,只需重新启动应用程序即可获得相同的位置。
package com.example.ruituodemo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.system.ApplicationTemp;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class RuituoDemoApplicationTests {
@Test
void contextLoads() {
ApplicationTemp temp = new ApplicationTemp();
System.out.printf("临时目录:%s",temp.getDir());
}
}
输出结果:
临时目录:C:\Users\qx\AppData\Local\Temp\05AAA8D3CAE6D94A052FC9A13AB3958E07278AEC
五、系统属性、环境变量访问
当你需要访问系统属性时可以通过SystemProperties类非常方便的获取。如果你访问的属性不存在时,那么它会从环境变量中获取。
package com.example.ruituodemo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.system.SystemProperties;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class RuituoDemoApplicationTests {
@Test
void contextLoads() {
System.out.printf("Java.home=%s", SystemProperties.get("java.home"));
}
}
输出结果:
Java.home=D:\Program Files\JetBrains\IntelliJ IDEA 2023.1.3\jbr
六、实例化对象
Instantiator通过注入可用参数来实例化对象的简单工厂。
package com.example.ruituodemo;
import com.example.ruituodemo.bean.MyInterface;
import org.junit.jupiter.api.Test;
import org.springframework.boot.system.SystemProperties;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.util.Instantiator;
import java.util.List;
@SpringBootTest
class RuituoDemoApplicationTests {
@Test
void contextLoads() {
Instantiator<MyInterface> instantiator = new Instantiator<>(MyInterface.class, p -> {
});
List<MyInterface> myInterfaceList = instantiator.instantiate(List.of("com.example.ruituodemo.bean.A", "com.example.ruituodemo.bean.B"));
System.out.println(myInterfaceList);
}
}
输出结果:
[com.example.ruituodemo.bean.A@c89e263, com.example.ruituodemo.bean.B@4d5ea776]
七、资源加载
如果你想将后缀为.properties,.xml,.yaml资源文件加载,那么你可以使用PropertiesPropertySourceLoader与YamlPropertySourceLoader。
package com.example.ruituodemo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.env.PropertiesPropertySourceLoader;
import org.springframework.boot.env.YamlPropertySourceLoader;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.ClassPathResource;
import java.io.IOException;
import java.util.List;
@SpringBootTest
class RuituoDemoApplicationTests {
@Test
void contextLoads() throws IOException {
// 加载properties文件
PropertiesPropertySourceLoader propertySourceLoader = new PropertiesPropertySourceLoader();
List<PropertySource<?>> list = propertySourceLoader.load("iot", new ClassPathResource("iot.properties"));
System.out.println(list.get(0).getSource());
//加载yml文件
YamlPropertySourceLoader yamlPropertySourceLoader = new YamlPropertySourceLoader();
List<PropertySource<?>> sourceList = yamlPropertySourceLoader.load("sp", new ClassPathResource("sp.yml"));
System.out.println(sourceList.get(0).getSource());
}
}
创建的两个文件具体内容如下所示:
输出结果:
{device=iphone}
{document=name=admin}
八、获取basePackages
如果你需要在代码中获取当前应用启动类所在的基包basePackages,那么我们可以通过下面的方式获取。
package com.example.ruituodemo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigurationPackages;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootTest
class RuituoDemoApplicationTests {
@Autowired
private ConfigurableApplicationContext context;
@Test
void contextLoads() {
System.out.println("basePackages:" + AutoConfigurationPackages.get(context));
}
}
输出结果:
basePackages:[com.example.ruituodemo]