2016-08-18 159 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 

爲對象,如果你沒有在代碼中自己創建它,你需要確保它有一個公共的默認構造函數。然後,像使用.進行導航,像任何其他對象一樣導航對象。假設你S3InputConfigname特性(與getNamesetName):

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'來設置對象屬性時,它仍然爲空。 – TheDoctor

+0

我用對象的類更新了我的問題。 – TheDoctor

+0

您無法初始化完整的對象,您需要按照我在示例中所做的來初始化各個字段。最後注意'.name'。我不知道那些'@ Expose'是什麼,但你需要getter/setter來讓綁定工作。 –

0

它非常簡單地爲屬性bean創建和初始化嵌入對象。

E.g.如果你有這樣的類:

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

    private S3OutputConfig outputConfig = new S3OutputConfig(); 

    public S3OutputConfig getOutputConfig() { 
     return outputConfig; 
    } 
} 

其中S3OutputConfig結構:

public class S3OutputConfig { 

    public String name; 

    public S3Region region; 

    public String accessKey; 

    public String secretKey; 

    public String bucket; 

    public String prefix; 

    public boolean makePublic; 
} 

您可以通過這種方式初始化outputConfig的領域:從你的庫連班工作時

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

常不控制你可以通過這樣做來創建一個bean:

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

    // Do whatever else you want to setup the bean 

    return s3OutputConfig; 
} 

這允許靈活性以包括其他豆類/配置(它們被自動裝配),其被需要以初始化豆。

0

另一種選擇是在構建@Bean時使用@CondtionalOnProperty。這樣您可以限制將哪些bean添加到上下文中。