Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何基于属性文件中的值创建多个bean_Java_Spring_Spring Boot_Prototype - Fatal编程技术网

Java 如何基于属性文件中的值创建多个bean

Java 如何基于属性文件中的值创建多个bean,java,spring,spring-boot,prototype,Java,Spring,Spring Boot,Prototype,我想根据配置文件中的值创建多个bean。 我已经在配置文件中准备好了bean。但是如何创建多个bean呢 我的当前配置文件 @Configuration public class JMSConfig { @Bean public DefaultMessageListenerContainer listenerContainers() { ... } } 我的想法是达到要求。如果我使用prototype scope,每次我请求一个新bean时,我都会得到

我想根据配置文件中的值创建多个bean。 我已经在配置文件中准备好了bean。但是如何创建多个bean呢

我的当前配置文件

@Configuration
public class JMSConfig {

    @Bean
    public DefaultMessageListenerContainer listenerContainers() {
        ...
    }
}
我的想法是达到要求。如果我使用prototype scope,每次我请求一个新bean时,我都会得到一个新bean。所以我添加了原型

@Configuration
public class JMSConfig{
    @Value("${value}")
    private long value;

    @Bean
    @Scope("prototype")
    public DefaultMessageListenerContainer listenerContainers() {
        .....
    }

     for(i = 0; i < value; i++){
         //get a new bean
     }
}
@配置
公共类JMSConfig{
@值(“${Value}”)
私人长期价值;
@豆子
@范围(“原型”)
public DefaultMessageListenerContainer listenerContainers(){
.....
}
对于(i=0;i
我面临的重要挑战是

  • 如何获得一个新bean(我评论的部分)
  • 如何在启动应用程序时触发“for”循环 我是否需要在其他课程中完成此部分,或者如何达到此要求

  • 如果您想从springboot
    main
    方法中直接取出bean。 像这样使用smth:

    @SpringBootApplication
    public class MyApplication {
    
        public static void main(final String[] args) {
            ApplicationContext context = SpringApplication.run(MyApplication.class, args);
    
            final int totalBeans = context.getEnvironment().getProperty("totalBeans")
            final List<DefaultMessageListenerContainer> beans = new ArrayList<>();
            for (int i = 0; i < totalBeans; i++) {
                beans.add(context.getBean(DefaultMessageListenerContainer.class));
            }
    
        }
    
    }
    

    我想在配置文件中这样做,如果我在main方法中这样做,我的应用程序将无法工作,因为它看到DMLC不存在,它将失败。所以每次我调用listenerContainers()方法时,我都会得到一个新的bean?通常不完全是这个bean。调用
    listenerContainers()
    时,您可能创建了一个
    新的DefaultMessageListenerContainer(…)
    对象。当您使用@bean注释将其定义为bean时,它就变成了一个bean。具有
    prototype
    作用域的bean每次从容器请求时都会返回不同的实例。使用
    singleton
    范围定义bean意味着容器创建该bean的单个实例,对该bean名称的所有请求都将返回相同的对象,该对象被缓存。对该对象的任何修改都将反映在对beanHey Alex的所有引用中,你能看看这个吗?@hars通过上面的链接回答。顺便说一句,如果你对答案感到满意,请随意接受
    @Value("totalBeans")
    private int totalBeans;
    
    @Bean 
    public List<DefaultMessageListenerContainer> beans() {
        final List<DefaultMessageListenerContainer> beans = new ArrayList<>();
        for (int i = 0; i < totalBeans; i++) {
            beans.add(new DefaultMessageListenerContainer());
        }
        return beans;
    }
    
    ...
    
    @Autowired private List<DefaultMessageListenerContainer> beans;