【问题标题】:How to create beans dynamically in spring custom starter based on property如何在基于属性的spring自定义启动器中动态创建bean
【发布时间】:2020-06-17 11:18:08
【问题描述】:

我正在编写一个自定义的spring starter,我需要根据application.properties中定义的属性注册一个相同类型的bean列表

我在 application.properties 中有以下属性

mybean.names = mybean1, mybean2
mybean1.foo = foo1
mybean2.foo = foo2
mybean1.bar = bar1
mybean2.bar = bar2

自动配置类的当前实现如下

@Configuration
@ConditionalOnClass(MyBeanFactory.class)
public class MyBeanAutoConfiguration {
@Autowire
Environemnt evn;

@Bean(name = {"mybean1"})
public MyBean getBean() {
  String[] names = StringUtils.commaDelimitedListToStringArray(evn.getProperty("mybean.names"));
  MyBean mybean = new Mybean(evn.getProperty(names[0] + ".foo"), 
                               evn.getProperty(names[0] + ".bar"));
return myBean;

}

}

我想在 Spring Boot 应用程序中简单地使用 qualifer 自动装配我的 bean,如下所示

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyApplication {

  @Autowired
  @Qualifer("mybean1")
  MyBean mybean;

  public static void main(String[] args) {
    SpringApplication.run(VaultApplication.class, args);
  }

如何更改我的自动配置类以创建多个在属性文件中定义的具有不同名称的 bean(在这种情况下,我如何创建 bean mybean2)以便我可以简单地使用带有限定符的自动装配?

【问题讨论】:

    标签: spring spring-boot spring-starter


    【解决方案1】:

    我不确定我是否理解你的问题,但是如果你想拥有几个不同名称的 bean,那么最好的方法是在你的配置类中编写多个不同名称的 @Bean 方法,这样你就可以通过 @ 自动装配它们中的每一个限定符

    【讨论】:

    • 如何动态初始化 mybean2 ?取决于属性 mybean.names
    • 动态初始化 bean 并不是一种常见的方法。因此,如果必须,您可以在 spring boot 启动后手动将其添加到 applicationContext 中。见link 和link。但最好的方法仍然是添加新的@Bean 方法,正如我在回答中所说的那样
    猜你喜欢
    • 1970-01-01
    • 2013-11-16
    • 2011-11-30
    • 2011-01-05
    • 2012-08-18
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多