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


问题内容

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

    }

}

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

}

问题答案:

Environment是配置文件和属性的组合。

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

引用Environment文档:

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

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

但是,在大多数情况下,应用程序级Bean不必直接与环境交互,而必须将$
{…}属性值替换为属性占位符配置程序,例如PropertySourcesPlaceholderConfigurer,该属性本身是EnvironmentAware,自使用时,Spring
3.1默认注册<context:property-placeholder/>

因此,总结一下:

  1. 使用该Environement对象,您可以访问与配置文件有关的信息。你不能这样做@Value
  2. 除非您需要与配置文件相关的信息(并且您可能不需要),否则应坚持使用@Value注释。