4

@PropertySourceSpringで使用する利点は何ですか?


構成を考えると...

@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スプリングカップリングを増やす
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 に答える