在SpringBoot中如何给静态属性赋值

925 阅读1分钟

前言

在实际开发中,我们经常需要给静态属性赋值,值的来源于yml或者是properties文件。就不能单独去使用@Value注解了,下面介绍几种方式进行属性注入。

平常我们就是像下面方式使用的:

@Value("${channl.ali.appId}")
String appId;

set 方法注入

@Value注解标注在 set 方法上

@Component
public class StaticValue {

    public static String APP_ID;
    public static String APP_USER;

    @Value("${channl.ali.appId}")
    public void setAppId(String appId) {
        APP_ID = appId;
    }

    @Value("${channl.ali.appUser}")
    public void setAppUser(String appUser) {
        APP_USER = appUser;
    }
}

注:该类需要被Spring管理,setXx方法名可以随便起

使用

在需要使用的地方直接使用 .属性名称

	@Test
	void contextLoads() {
		System.out.println(StaticValue.APP_ID);
		System.out.println(StaticValue.APP_USER);
	}

@PostConstruct

PostConstruct注解,是Java提供的一个注解。被@PostConstruct注解标注的方法将会在构造方法依赖注入完成后被自动调用,什么叫做在依赖注入之后调用呢?下面举个小例子,具体的源码将会在之后的源码文章分析到。 各位小伙伴如果有兴趣可以先看看其他源码分析:Spring源码阅读目录

使用

    @Value("${channl.ali.appId}")
    private String appId;

    @Value("${channl.ali.appUser}")
    private String appUser;

    //@Autowired
    private Environment environment;

   public StaticValue() {
        System.out.println("构造方法执行 = " + environment);
    }

    @Autowired
    private void setq(Environment environment){
        System.out.println("依赖注入方法执行 = " + environment);
        this.environment = environment;
    }

	@PostConstruct
    public void init(){
        System.out.println("PostConstruct 标注的init方法执行");
        APP_ID = environment.getProperty("channl.ali.appId");
        APP_USER = environment.getProperty("channl.ali.appUser");
        //APP_ID = appId;
        //APP_USER = appUser;
    }

在项目启动的时候你就会看到控制会打印如下语句:
    
构造方法执行 = null
    
依赖注入方法执行 = StandardServletEnvironment {activeProfiles=[], defaultProfiles=[default], propertySources=[ConfigurationPropertySourcesPropertySource {name='configurationProperties'}, StubPropertySource {name='servletConfigInitParams'}, ServletContextPropertySource {name='servletContextInitParams'}, PropertiesPropertySource {name='systemProperties'}, OriginAwareSystemEnvironmentPropertySource {name='systemEnvironment'}, RandomValuePropertySource {name='random'}, OriginTrackedMapPropertySource {name='Config resource 'classpath:/application.yml' via location 'optional:classpath:/''}]}

PostConstruct 标注的init方法执行

注:使用 Environment 和 @Value两种方式都是可以的。所以可以得知:构造方法 > @Autowired(依赖注入)> @PostConstruct(标注的方法)

实现InitializingBean接口

实现InitializingBean接口并重写其afterPropertiesSet方法。先用@value的方式先获取配置文件的值,然后在 afterPropertiesSet方法里将值赋值给静态属性。InitializingBean这个接口也会在之后的源码文章中进行分析。各位小伙伴如果有兴趣可以先看看其他源码分析:Spring源码阅读目录

使用

    @Value("${channl.ali.appId}")
    private String appId;

    @Value("${channl.ali.appUser}")
    private String appUser;

    //@Autowired
    private Environment environment;

  @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet 初始化方法执行");
//        //APP_ID = environment.getProperty("channl.ali.appId");
//       // APP_USER = environment.getProperty("channl.ali.appUser");
        APP_ID = appId;
        APP_USER = appUser;
    }

    @PostConstruct
    public void init(){
        System.out.println("PostConstruct 标注的init方法执行");
        //APP_ID = environment.getProperty("channl.ali.appId");
        //APP_USER = environment.getProperty("channl.ali.appUser");
        //APP_ID = appId;
        //APP_USER = appUser;
    }
在项目启动的时候你就会看到控制会打印如下语句:
    
构造方法执行 = null
    
依赖注入方法执行 = StandardServletEnvironment {activeProfiles=[], defaultProfiles=[default], propertySources=[ConfigurationPropertySourcesPropertySource {name='configurationProperties'}, StubPropertySource {name='servletConfigInitParams'}, ServletContextPropertySource {name='servletContextInitParams'}, PropertiesPropertySource {name='systemProperties'}, OriginAwareSystemEnvironmentPropertySource {name='systemEnvironment'}, RandomValuePropertySource {name='random'}, OriginTrackedMapPropertySource {name='Config resource 'classpath:/application.yml' via location 'optional:classpath:/''}]}

PostConstruct 标注的init方法执行
    
afterPropertiesSet 初始化方法执行    

注:使用 Environment 和 @Value两种方式都是可以的

  • 如你对本文有疑问或本文有错误之处,欢迎评论留言指出。如觉得本文对你有所帮助,欢迎点赞和关注。

代码已托管在Gitee:给静态属性赋值