我有一个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的设置?
感谢您的帮助。
答案 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 {
}
注意:请注意,字段名称(queue
,connection
)和属性嵌套反映了yaml
。
此外,您不必强制在单个类中定义所有属性。您可以在@EnableConfigurationProperties({AppProperties1.class, AppProperties2.class, AppProperties3.class})
答案 1 :(得分:1)
您可以扩展Settings
,因为@ConfigurationProperties
的绑定是基于setter的,希望它们是public
:
@ConfigurationProperties(prefix = "queue.connection")
public class AutoConfigurationSettings extends Settings {
}
要通过使用Spring Boot的Binder实用程序(@ConfigurationProperties所做的)绑定到类似的属性,您需要在java.util.List(或Set)类型的目标bean中具有一个属性,或者提供设置器或使用可变值对其进行初始化。例如,以下示例绑定到前面显示的属性: