有一个spring-boot项目使用yaml作为配置文件。
application.yaml - 部分:
spring:
redis:
host: localhost
port: 6379
dummy config.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或其他配置文件的属性。
我在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的名称。
并且在应用程序中没有添加关于mongodb
的依赖项。
测试结果如下:
@Bean
方法命名为helloBean
,然后可以成功创建,两个记录器行都打印出来。@Bean
方法重命名为任何先前打印的bean名称(例如requestContextFilter
),那么@Bean
方法中的记录器行将不会被打印,这意味着该方法无法创建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,甚至是一个警告。