在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 给静态变量赋值/给静态方法注入值
|
3天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的音乐推荐管理系统
基于Java+Springboot+Vue开发的音乐推荐管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的音乐推荐管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
39 8
基于Java+Springboot+Vue开发的音乐推荐管理系统
|
3天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的母婴商城管理系统
基于Java+Springboot+Vue开发的母婴商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的网上母婴商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
21 7
基于Java+Springboot+Vue开发的母婴商城管理系统
|
4天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的在线摄影预约管理系统
基于Java+Springboot+Vue开发的在线摄影预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的在线摄影管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
20 8
基于Java+Springboot+Vue开发的在线摄影预约管理系统