如何创建bean?

时间:2019-02-22 15:36:01

标签: spring spring-boot

我有一个application.yml文件:

queue:
  connection:
    username: user
    password: user1

我要包括另一个包含Settings.java类的库:

public class Settings {
    private String user;
    private String password;
    ...
    // getters, setters
}

我没有机会更改Settings类。 我想做这样的事情:

@Configuration
@EnableConfigurationProperties
public class SpringConfig {
    @Bean
    @ConfigurationProperties(prefix = "queue.connection")
    public Settings settings() {
        return new Settings();  // Instance was created but without properties from application.yml
    }
}

我该如何使用application.yml文件中的属性创建bean的设置?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

为包装Settings的属性定义单独的类:

@ConfigurationProperties(prefix = "queue")
public class QueueConnectionProperties {
    private Settings connection = new Settings(); 
    // no-args constructor, getter & setter
}

此外,只需添加@EnableConfigurationProperties(QueueConnectionProperties.class)即可为您创建属性Bean,因此无需显式创建Bean。例如。以下就足够了:

@Configuration
@EnableConfigurationProperties(QueueConnectionProperties.class)
public class AppConfig {
}

如果要拥有一个全局属性,可以定义以下内容:

@ConfigurationProperties
public class AppProperties {

    private QueueConnectionProperties queue = new Queue();
    // other properties

    // no-args constructor, getter & setter

    public static class QueueConnectionProperties {
        private Settings connection = new Settings(); 
        // no-args constructor, getter & setter
    }
}

@Configuration
@EnableConfigurationProperties(AppProperties.class)
public class AppConfig {
}

注意:请注意,字段名称(queueconnection)和属性嵌套反映了yaml

此外,您不必强制在单个类中定义所有属性。您可以在@EnableConfigurationProperties({AppProperties1.class, AppProperties2.class, AppProperties3.class})

中列出多个类别

答案 1 :(得分:1)

您可以扩展Settings,因为@ConfigurationProperties的绑定是基于setter的,希望它们是public

@ConfigurationProperties(prefix = "queue.connection")
public class AutoConfigurationSettings extends Settings {

}

根据24.7.1 Loading YAML

  

要通过使用Spring Boot的Binder实用程序(@ConfigurationProperties所做的)绑定到类似的属性,您需要在java.util.List(或Set)类型的目标bean中具有一个属性,或者提供设置器或使用可变值对其进行初始化。例如,以下示例绑定到前面显示的属性: