@Value注释和Environment API之间的区别?

时间:2014-11-12 21:50:26

标签: spring spring-mvc

使用@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);
    }

}

1 个答案:

答案 0 :(得分:15)

Environment是个人资料和属性的组合。

配置文件是bean定义的命名逻辑组,可以根据您的环境处于活动状态还是非活动状态。可以将Bean分配给配置文件,无论是以XML还是通过注释定义。对于前者您可能有一个用于开发模式的配置文件,另一个用于生产模式。您可以在此处查找@Profile的文档以查看有关它的更多详细信息。

引用Environment文档:

  

与配置文件相关的Environment对象的作用是确定哪些配置文件(如果有)当前处于活动状态,以及默认情况下哪些配置文件(如果有)应处于活动状态。

除非您需要访问该信息,否则应坚持使用带有${..}格式和@Value注释的占位符表示法。再次引用docs

  

但是,在大多数情况下,应用程序级bean不需要直接与Environment交互,而是可能必须将$ {...}属性值替换为属性占位符配置器,例如PropertySourcesPlaceholderConfigurer,它本身就是EnvironmentAware从使用<context:property-placeholder/>时默认情况下注册到Spring 3.1。

所以,总结一下:

  1. 使用Environement对象,您可以访问与配置文件相关的信息。您无法使用@Value
  2. 执行此操作
  3. 除非您需要与个人资料相关的信息(您可能不应该这样做),否则您应该坚持使用@Value注释。