4

@PropertySource在Spring中使用有什么好处?


给定一个配置...

@Configuration
@PropertySource("classpath:foo.properties")
public class Config {}

...我们可以访问Environment

public class Foo {
      @Autowire Environment env;

      public void bar() {
         String foo = env.getProperty("foo");
      }
}

我们已经可以使用常规系统属性来做到这一点。甚至配置文件管理也很容易使用系统属性

if (profile1) System.setProperty("foo", "bar") 
else          System.setProperty("foo", "baz");

...和

System.getProperty("foo"); // also shorter than autowiring an environment

加上系统属性没有一些缺点@PropertySource

  • 系统属性是可迭代的,PropertySource不是
  • PropertySource不允许后备属性 - 创建自定义PropertySource至少等于对系统属性执行相同操作的代码。
  • Environment@Autowire增加 Spring 耦合
4

2 回答 2

3
  1. 您可以提供带有键/值对的属性文件,并将其注入您的环境。如果您有大量环境属性,这会更容易一些。您也可以指定多个文件。
  2. 假设您会事先知道该属性(在使用它之前)。因此,键值对是有意义的。
  3. 您有弹簧活动配置文件概念来管理配置文件。这比自己通过系统属性更容易。
于 2013-10-31T18:48:32.843 回答
1

从属性文件中读取值远远优于在类文件中对它们进行硬编码。如果您硬编码,那么如果您想更改其中任何一个,则需要重新编译。

回答您的批评:

1.

系统属性是可迭代的,PropertySource 不是

大多数 PropertySource 扩展 EnumerablePropertySource。虽然我不确定你想要迭代你的属性的用例

2.

PropertySource 不允许后备属性 - 创建自定义 PropertySource 至少等于对系统属性执行相同操作的代码。

而不是隐藏在自定义属性源中的回退,您可以使用标准的弹簧属性获取器。例如

env.getProperty("someProp", "someFallback")

甚至

env.getProperty("someProp", env.getProperty("someFallback", "lastResort"))

3.

Environment 和 @Autowire 增加 Spring 耦合

它是自动接线提供弹簧联轴器,如果你不想使用它,你不需要使用它。例如

public class Foo {
    private final String foo;

    public Foo(String foo) {
        this.foo = foo;
    }

    public void bar() {
        // doo something with foo
    }
}

@Configuration
@PropertySource("classpath:foo.properties")
public class Config {
    @Autowired
    public Environment env;

    @Bean
    public Foo foo() {
        return new Foo(env.getProperty("foo"));
    }
}
于 2013-11-04T02:37:20.570 回答