使用@Value注释注入类并使用Spring Environment API查找它们之间是否存在任何显着差异?一个优先于另一个(在什么情况下)?
使用@Value的示例:
class Config {
@Value("${db.driverClassName}")
private String driverClassName;
@Value("${db.url}")
private String url;
@Value("${db.username}")
private String username;
@Value("${db.password}")
private String password;
@Bean
public javax.sql.DataSource dataSource(){
PoolProperties poolProperties = new PoolProperties();
poolProperties.setDriverClassName(driverClassName);
poolProperties.setUrl(url);
poolProperties.setUsername(username);
poolProperties.setPassword(password);
return new org.apache.tomcat.jdbc.pool.DataSource(poolProperties);
}
}
使用Environment API的示例:
class Config {
@Autowired
private Environment environment;
@Bean
public javax.sql.DataSource dataSource(){
PoolProperties poolProperties = new PoolProperties();
poolProperties.setDriverClassName(environment.getProperty("db.driverClassName"));
poolProperties.setUrl(environment.getProperty("db.url"));
poolProperties.setUsername(environment.getProperty("db.username"));
poolProperties.setPassword(environment.getProperty("db.password"));
return new org.apache.tomcat.jdbc.pool.DataSource(poolProperties);
}
}
答案 0 :(得分:15)
Environment
是个人资料和属性的组合。
配置文件是bean定义的命名逻辑组,可以根据您的环境处于活动状态还是非活动状态。可以将Bean分配给配置文件,无论是以XML还是通过注释定义。对于前者您可能有一个用于开发模式的配置文件,另一个用于生产模式。您可以在此处查找@Profile
的文档以查看有关它的更多详细信息。
引用Environment
文档:
与配置文件相关的Environment对象的作用是确定哪些配置文件(如果有)当前处于活动状态,以及默认情况下哪些配置文件(如果有)应处于活动状态。
除非您需要访问该信息,否则应坚持使用带有${..}
格式和@Value
注释的占位符表示法。再次引用docs:
但是,在大多数情况下,应用程序级bean不需要直接与Environment交互,而是可能必须将$ {...}属性值替换为属性占位符配置器,例如PropertySourcesPlaceholderConfigurer,它本身就是EnvironmentAware从使用
<context:property-placeholder/>
时默认情况下注册到Spring 3.1。
所以,总结一下:
Environement
对象,您可以访问与配置文件相关的信息。您无法使用@Value
@Value
注释。