2016-08-18 158 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添加到上下文中。