如何通过@Bean标记的方法创建bean,并使用yaml文件中的属性?

问题描述 投票:0回答:1

有一个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中的属性?

@Update

在讨论和测试之后,问题已成为关于@Bean标记的方法的名称,而不是关于yaml或其他配置文件的属性。

java spring spring-boot spring-bean
1个回答
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的名称。

并且在应用程序中没有添加关于mongodb的依赖项。

测试结果如下:

  • 首先,@Bean方法命名为helloBean,然后可以成功创建,两个记录器行都打印出来。
  • 如果将@Bean方法重命名为任何先前打印的bean名称(例如requestContextFilter),那么@Bean方法中的记录器行将不会被打印,这意味着该方法无法创建bean,我猜。但是内置的bean requestContextFilter仍然是创建的,因为它位于打印的bean名称列表中。
  • 如果将@Bean方法重命名为mappingMongoConverter(这不是以前的打印bean名称,但如果依赖spring-boot-starter-data-mongodb,则会创建该名称的bean)。结果是:bean也不会被创建,与requestContextFilter相同。

我猜:

  • 也许那些特殊名称(例如requestContextFiltermappingMongoConverter)在spring-boot-starter-web(或其他基本的spring-boot依赖项)中的某处定义,如果用户定义的@Bean方法使用相同的名称,那么它将无法以静默方式创建bean,甚至是一个警告。
© www.soinside.com 2019 - 2024. All rights reserved.