spring - @Value 注解和 Environment API 的区别?

标签 spring spring-mvc

使用@Value 注解注入(inject)类的字段和使用 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文档:

The role of the Environment object with relation to profiles is in determining which profiles (if any) are currently active, and which profiles (if any) should be active by default.

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

In most cases, however, application-level beans should not need to interact with the Environment directly but instead may have to have ${...} property values replaced by a property placeholder configurer such as PropertySourcesPlaceholderConfigurer, which itself is EnvironmentAware and as of Spring 3.1 is registered by default when using <context:property-placeholder/>.

所以,总结一下:

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

关于spring - @Value 注解和 Environment API 的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26897314/

相关文章:

java - 如何动态绕过 spring-hibernate 中字段的验证

java - org.springframework.web.servlet.DispatcherServlet noHandlerFound 404错误响应

java - Maven 需要为托管依赖项指定插件版本 spring-boot-configuration-processor

java - 在 DispatcherServlet 中未找到名称为 'dispatcher' 的 URI [/app/j_spring_security_login] 的 HTTP 请求的映射

java - 将 Spring Integration 中的轮询器配置为队列

java - 如何在应用程序级别处理行锁争用

model-view-controller - 如何重写ResourceHttpRequestHandler来实现自定义的资源处理程序?

java - 如何使用 spring 管理 REST API 版本控制?

java - 未找到 HTTP 请求与 URI 的映射

java - Spring mvc servlet url 未正确映射