最近在使用springboot写一些项目,其中有一个配置类,例子如下:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
@Configuration
public class JestConfig {
@Value("${a.test}")
private String ip;
@Bean(name = "test")
public void Client(){
System.out.println("ip:"+ip);
}
public JestConfig() {
System.out.println(ip);
}
}
appilication.properties配置如下:
a.test=123
然后发现在构造方法中数据的ip为null,而在@Bean注解的方法下面却可以输出值。
经过一番探索,大概原因如下:
Spring的ApplicationContext在加载类的时候有一定的顺序,这三者的顺序大概如下:
构造方法->@Value->@Bean
故而在构造方法中调用@Value的属性值,拿到的是null,而在初始化bean时,@Value注解的属性已经被赋值,所以我们在构造方法中是无法取到@Value注解的值。
有这样的解决办法:
新建一个Config类,在@Bean注解的类中引用:
@Configuration
@Data
public class Config {
@Value("{a.test}")
private String ip;
}
@Component
public class Client {
@Autowired
private Config config;
@Bean(name = "test")
public void client() {
System.out.println("ip:"+config.getIp());
}
}
这样就可以获得配置文件中的参数。