2013-10-31 100 views
2

在Spring中使用@PropertySource有什麼好處?使用Spring PropertySource的優點是什麼?


給定的配置...

@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 

Plus系統性能沒有一些@PropertySource

  • 系統屬性中的不足之處是可迭代,PropertySource不是
  • PropertySource不允許回退屬性 - 和creati自定義PropertySource至少等於系統屬性的代碼。
  • Environment@Autowire增加彈簧聯軸器

回答

1

從屬性文件中讀取值遠遠優於在類文件中對它們進行硬編碼。如果你硬編碼,那麼你需要重新編譯,如果你想改變它們中的任何一個。

要回答你的批評:

1.

系統屬性是可迭代的,PropertySource不

大多數PropertySources延伸EnumerablePropertySource。雖然我不能確定用例的,你會想遍歷你的屬性

2.

PropertySource不允許回退性質 - 並創建自定義的 PropertySource至少等於做的代碼與 系統屬性相同。

您可以使用標準彈簧屬性獲取器,而不是隱藏自定義屬性源中的回退。例如

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

甚至

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

3.

環境和@Autowire增加彈簧聯軸器

這是自動裝配,讓彈簧聯軸器,而你不知道如果你不想要,不需要使用它。例如

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")); 
    } 
} 
3
  1. 你可以給用戶提供鍵/值對屬性文件將被注入到您的環境。如果您擁有大量的環境屬性,這使得它更容易一點。你也可以指定多個文件。
  2. 假設是你會事先知道屬性(在使用它之前)。因此,一個關鍵值對是有意義的。
  3. 您有彈簧活動配置文件概念來管理配置文件。這比通過系統屬性自己做起來要容易得多。
相關問題