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