有一个spring-boot项目使用yaml作为配置文件。
application.yaml - 部分:
spring:
redis:
host: localhost
port: 6379
DummyConfig.java:
@Configuration
public class DummyConfig {
private Logger logger = LoggerFactory.getLogger(DummyConfig.class);
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@PostConstruct
public void init() {
logger.info("redis host: {}", host);
}
@Bean
public String mappingMongoConverter() {
logger.info("redis host: {}", host);
return "HelloBean";
}
}
打印init()
中的记录器行,
而mappingMongoConverter()
中的记录器行不打印,
问题是:
@Bean
注释的方法中,如何使用yaml中的属性?讨论后&测试时,问题已成为@Bean
标记的方法的名称,而不是yaml或其他配置文件中的属性。
答案 0 :(得分:0)
我在spring-boot应用程序的入门类Application.java
中添加了以下方法:
/**
* Create a command line runner, that print bean names.
*
* @param ctx
* @return
*/
@Bean
public CommandLineRunner initRunner(ApplicationContext ctx) {
return args -> {
printBeanNames((ConfigurableApplicationContext) ctx);
};
}
/**
* Print bean names.
*
* @param ctx
*/
private void printBeanNames(ConfigurableApplicationContext ctx) {
String[] beanNames = ctx.getBeanDefinitionNames();
Arrays.sort(beanNames); // sort,
logger.info("bean count: {}", beanNames.length);
for (int i = 0; i < beanNames.length; i++) {
System.out.printf("\t[%4d]: %s\n", i, beanNames[i]);
}
}
将按字母顺序打印应用程序上下文中所有bean的名称。
在应用程序中添加了 no 关于mongodb
的依赖项。
测试结果为:
@Bean
方法名为helloBean
,然后可以成功创建,同时打印两个记录行。@Bean
方法重命名为任何先前打印的bean名称(例如requestContextFilter
),则不会打印@Bean
方法中的记录器行,这意味着该方法未能我想是创造豆子。
但是仍然创建了内置bean requestContextFilter
,因为它位于打印的bean名称列表中。@Bean
方法重命名为mappingMongoConverter
(不在以前的打印bean名称中,但如果依赖spring-boot-starter-data-mongodb
,将创建该名称的bean )。结果是:也不会创建bean,与requestContextFilter
相同。我猜:
requestContextFilter
,mappingMongoConverter
)在spring-boot-starter-web
(或其他基本的spring-boot依赖)中的某处定义,如果是用户定义的@Bean
方法使用相同的名称,然后它将无法以静默方式创建bean,甚至没有警告。