2016-08-18 6 views
2

私はスプリングブートアプリケーションで@Autowiredを使用していくつかのプロパティを初期化します。 私はどのように私はプリミティブなデータ型を初期化することができますが、私はオブジェクトを初期化する方法を知りません。application.propertiesを使用してオブジェクトを初期化する

Componentです:

@Component 
@ConfigurationProperties(prefix = "bitmovin.bitmovin") 
public class BitmovinConfig { 

    private S3InputConfig S3InputConfig = new S3InputConfig(); 
    private int threadPoolSize; 
    private ArrayList<String> testFiles; 

    public BitmovinConfig() { 
    } 

    public S3InputConfig getS3InputConfig() { 
     return S3InputConfig; 
    } 

    public void setS3InputConfig(S3InputConfig s3InputConfig) { 
     S3InputConfig = s3InputConfig; 
    } 

    public int getThreadPoolSize() { 
     return threadPoolSize; 
    } 

    public void setThreadPoolSize(int threadPoolSize) { 
     this.threadPoolSize = threadPoolSize; 
    } 

    public ArrayList<String> getTestFiles() { 
     return testFiles; 
    } 

    public void setTestFiles(ArrayList<String> testFiles) { 
     this.testFiles = testFiles; 
    } 
} 

そして、それは私のapplication.propertiesファイルです:

bitmovin.bitmovin.threadPoolSize = 30 
bitmovin.bitmovin.S3InputConfig = ?? 
bitmovin.bitmovin.testFiles= ?? 

私はapplication.propertiesにオブジェクトまたはリストを初期化するにはどうすればよいですか?

UPDATE

私は初期化したい、自分自身を作成し​​ていないオブジェクト、:リストについて

public class S3OutputConfig { 
    @Expose 
    public String name; 
    @Expose 
    public S3Region region; 
    @Expose 
    public String accessKey; 
    @Expose 
    public String secretKey; 
    @Expose 
    public String bucket; 
    @Expose 
    public String prefix; 
    @Expose 
    public boolean makePublic; 
} 

答えて

1

を、あなたはいくつかの方法があります。

bitmovin.bitmovin.testFiles=foo,bar,biz 

はの3つの項目を設定します。また、インデックスを使って物事をコントロールすることもできます。あなたはコードでそれを自分で作成しない場合は上記のコードは、オブジェクトの場合

bitmovin.bitmovin.testFiles[0]=foo 
bitmovin.bitmovin.testFiles[1]=bar 
bitmovin.bitmovin.testFiles[2]=biz 

のように書き換えることができ、あなたはそれがパブリックデフォルトコンストラクタを持っていることを確認する必要があります。次に、他のオブジェクトと同様にオブジェクトをナビゲートし、.を使用してナビゲートします。あなたのS3InputConfigは(getNamesetName付き)name性質を持っていると仮定します

bitmovin.bitmovin.s3InputConfig.name=the name 

ブートのドキュメントで小文字のハイフンの使用をたくさん見てきました。オリジナルの書式だけでなく、ハイフンの小文字やその他のものもサポートしています(relaxed binding参照)。設定の正規表現は次のようになります。

bitmovin.bitmovin.test-files[0]=foo 
bitmovin.bitmovin.test-files[1]=bar 
bitmovin.bitmovin.test-files[2]=biz 
bitmovin.bitmovin.s3-input-config.name=the name 
+0

あなたの提案は非常にうまく動作しますが、私は 'bitmovin.bitmovin.s3-input-config.bucket = awesome-video'を使ってオブジェクトプロパティを設定してもまだnullです。 – TheDoctor

+0

質問をオブジェクトのクラスで更新しました。 – TheDoctor

+0

完全なオブジェクトを初期化することはできません。この例で行ったように、さまざまなフィールドを初期化する必要があります。最後に '.name'があることに注目してください。私はそれらの '@ Expose'が何であるか分かりませんが、バインディングのためにgetter/setterが必要です。 –

0

プロパティビーンの埋め込みオブジェクトを作成して初期化するのは簡単です。

など。あなたはこのようにoutputConfigのフィールドを初期化することができます

public class S3OutputConfig { 

    public String name; 

    public S3Region region; 

    public String accessKey; 

    public String secretKey; 

    public String bucket; 

    public String prefix; 

    public boolean makePublic; 
} 

bitmovin.bitmovin.output-config.name=Config Name 
bitmovin.bitmovin.output-config.access-key=XAKJGSDIUGASASD 
bitmovin.bitmovin.output-config.region=us-east-1 
0

通常のライブラリからクラスを操作する場合、あなたはあなたがそのようなクラスを持っている場合:S3OutputConfig構造

@Component 
@ConfigurationProperties(prefix = "bitmovin.bitmovin") 
public class BitmovinConfig { 

    private S3OutputConfig outputConfig = new S3OutputConfig(); 

    public S3OutputConfig getOutputConfig() { 
     return outputConfig; 
    } 
} 

あなたのコントロールではないこのような何かを行うことによって、豆を作成することができます:

@Bean 
S3OutputConfig s3OutputConfig(BitmovinConfig bitmovinConfig) { 
    S3OutputConfig s3OutputConfig = new S3OutputConfig(); 

    // Do whatever else you want to setup the bean 

    return s3OutputConfig; 
} 

これにより、Beanの初期化に必要な他のBean/Configuration(autowired)を柔軟に組み込むことができます。

0

もう1つの方法は、@Beanを構築するときに@CondtionalOnPropertyを使用することです。この方法で、どのBeanをコンテキストに追加するかを制限することができます。

関連する問題