我需要在类的实例变量中使用@Value
注入的参数,并且可以在其所有子类中重用该变量。
@Value(server.environment)
public String environment;
public String fileName = environment + "SomeFileName.xls";
这里的问题是fileName首先初始化然后发生环境注入。所以我总是得到null-SomeFileName.xls。
无论如何要传达在春天初始化@Value
。
答案 0 :(得分:19)
因此,您可以使用@PostConstruct
。来自documentation:
PostConstruct注释用于需要的方法 在完成依赖注入以执行任何操作之后执行 初始化。
@PostConstruct
允许您在设置属性后执行修改。一种解决方案是这样的:
public class MyService {
@Value("${myProperty}")
private String propertyValue;
@PostConstruct
public void init() {
this.propertyValue += "/SomeFileName.xls";
}
}
另一种方法是使用@Autowired
配置方法。来自documentation:
标记构造函数,字段,setter方法或配置方法 由Spring的依赖注入工具自动启动。
...
配置方法可以有任意名称和任意数量的参数; 每个参数都将使用匹配的bean自动装配 弹簧容器。 Bean属性setter方法实际上只是一个 这种通用配置方法的特例。这样的配置方法呢 不必公开。
示例:
public class MyService {
private String propertyValue;
@Autowired
public void initProperty(@Value("${myProperty}") String propertyValue) {
this.propertyValue = propertyValue + "/SomeFileName.xls";
}
}
不同之处在于,对于第二种方法,您没有额外的bean挂钩,您可以在自动装配时对其进行调整。
答案 1 :(得分:0)
您可以使用@Value从属性文件中读取值,这听起来更像是您希望实现的内容。
如果在xml或bean配置方法中配置PropertySourcesPlaceholderConfigurer,则会为spring设置值。
@Value("${server.env}")
private String serverEnv;
配置......
@Configuration
public class Cfg {
@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
final PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
propertySourcesPlaceholderConfigurer.setLocation(new ClassPathResource("/foo.properties"));
return propertySourcesPlaceholderConfigurer;
}
}
或xml方法
<context:property-placeholder location="classpath*:foo.properties"/>
答案 2 :(得分:0)
您也可以使用纯 spel 驱逐 @PostConstruct:
@Value("${server.environment}")
public String environment;
@Value("#{${server.environment} + 'SomeFileName.xls'}")
public String fileName;