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

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

前言

在实际开发中,我们经常需要给静态属性赋值,值的来源于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:给静态属性赋值

相关文章
|
4月前
|
XML Java 数据格式
SpringBoot中yml与properties配置文件及bean取值赋值
SpringBoot中yml与properties配置文件及bean取值赋值
413 0
|
10月前
|
Java
SpringBoot静态属性赋值:@Value注入静态属性
SpringBoot静态属性赋值:@Value注入静态属性
187 0
|
Java
SpringBoot 自定义注解 + AOP实现参数效验,默认值赋值
SpringBoot 自定义注解 + AOP实现参数效验,默认值赋值
382 2
|
Java
springboot启动时读取配置文件并赋值
springboot启动时读取配置文件并赋值
206 0
|
Java
Java-SpringBoot-06-随机数及自动给配置随机赋值
SpringBoot中提供了一个随机值属性源RandomValuePropertySource可以给配置文件自动赋值随机数
214 0
Java-SpringBoot-06-随机数及自动给配置随机赋值
|
Java
springboot IDEA 过滤器全局赋值的操作使用流程
springboot IDEA 过滤器全局赋值的操作使用流程
119 0
springboot 给静态变量赋值/给静态方法注入值
springboot 给静态变量赋值/给静态方法注入值
springboot 给静态变量赋值/给静态方法注入值
|
Java 应用服务中间件 Maven
传统maven项目和现在spring boot项目的区别
Spring Boot:传统 Web 项目与采用 Spring Boot 项目区别
450 0
传统maven项目和现在spring boot项目的区别
|
XML Java 数据库连接
创建springboot项目的基本流程——以宠物类别为例
创建springboot项目的基本流程——以宠物类别为例
142 0
创建springboot项目的基本流程——以宠物类别为例
|
存储 机器学习/深度学习 IDE
SpringBoot 项目与被开发快速迁移|学习笔记
快速学习 SpringBoot 项目与被开发快速迁移
SpringBoot 项目与被开发快速迁移|学习笔记