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

时间:2018-03-02 09:08:41

标签: java spring spring-boot spring-bean

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

@Update

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

1 个答案:

答案 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相同。

我猜:

  • 也许这些特殊名称(例如requestContextFiltermappingMongoConverter)在spring-boot-starter-web或其他基本的spring-boot依赖)中的某处定义,如果是用户定义的@Bean方法使用相同的名称,然后它将无法以静默方式创建bean,甚至没有警告。