一、获取进程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());
    }

}

创建的两个文件具体内容如下所示:

SpringBoot隐藏的几个工具类_SpringBoot

SpringBoot隐藏的几个工具类_SpringBoot_02

输出结果:

{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]