当前位置: 首页 > 知识库问答 >
问题:

如何在singleton bean内部制作原型bean?

苏华荣
2023-03-14

我需要能够创建新的bean实例——不是像在< code>proxyMode=*中那样在每次调用方法时创建,而是仅在需要时创建(例如,调用< code >)。getObject())。

我知道有对象工厂和服务工厂,但问题是我不能在java配置中定义工厂,而必须在bean中使用硬编码字符串。所以这就是我想实现的目标:

@Configuration
    class Config {
        @Bean
        public MessageListenerContainerFactory listenerContainerFactory() {
            MessageListenerContainerFactory listenerContainerFactory = new MessageListenerContainerFactory();
            listenerContainerFactory.setMessageListener(rabbitProcessor());
            return listenerContainerFactory;
        }

        @Bean
        @Scope(SCOPE_PROTOTYPE)
        public MessageListener rabbitProcessor() {
            return new RabbitProcessor();
        }

        @Bean
        @Scope(SCOPE_PROTOTYPE)
        public MessageListener notThisOne() {
            return new NotThisOne();
        }
    }

    class MessageListenerContainerFactory {

        private MessageListener messageListener;

        public void setMessageListener(MessageListener messageListener) {
            this.messageListener = messageListener;
        }

        public SimpleMessageListenerContainer createListenerContainer(){
            SimpleMessageListenerContainer setMessageListener= new SimpleMessageListenerContainer();

            //THIS HERE IS NEEDED!!!
            Object needed = SPRINGCONTEXT.GETBEANNAMEOF(this.messageListener).getObject();


            listenerContainer.setMessageListener(needed);
            return setMessageListener;
        }
    }

共有1个答案

诸葛奇玮
2023-03-14

您可以尝试使用@限定符注释。

ref-http://zetcode.com/articles/springbootqualifier/

@Bean
        @Qualifier("rabbitProcessor")
        @Scope(SCOPE_PROTOTYPE)
        public MessageListener rabbitProcessor() {
            return new RabbitProcessor();
        }

        @Bean
        @Qualifier("notThisOne")
        @Scope(SCOPE_PROTOTYPE)
        public MessageListener notThisOne() {
            return new NotThisOne();
        }

然后,您可以随时通过调用applicationContext上的getBean()来创建对象,如。。

applicationContext.getBean("rabbitProcessor");
//or
applicationContext.getBean("notThisOne");
 类似资料:
  • 问题内容: 我正在阅读有关Java中并发性的Oracle官方文档,但我想知道返回的返回值之间可能有什么区别? 并使用例如 。我假设我用一个。我知道,一般而言,同步集合对于我来说只是一个装饰器,因此很明显a 的内部结构有所不同。您是否有关于这些实施细节的信息? 编辑:我意识到源代码是公开可用的: ConcurrentHashMap.java 问题答案: 我会阅读ConcurrentHashMap的源

  • 问题内容: 我正在使用Eclipse服务器功能进行热代码部署。使用tomcat作为Web服务器。但是我不确定它是如何工作的。我有自己的理解,它必须如何在内部工作。 我的理解:- 当开发人员更改代码(例如,类Employee)时,Eclipse将在正确的位置(必须是特定的Web /应用服务器,将其称为热部署目录(HDD))放置/发布修改后的已编译类。 。现在将显示Web服务器特定的类加载器。它在HD

  • 我知道Spark可以使用Scala、Python和Java来操作。另外,RDDs用于存储数据。 但是请解释一下,Spark的架构是什么,内部是如何工作的。

  • 我目前正在构建一个python gRPC服务器,它将大量不同的proto消息序列化为json,以将它们存储到无sql数据库中。我希望简化此服务器的扩展,这样我们就可以添加新类型,而无需重写gRPC服务器和重新部署。理想情况下,我们希望定义一条新消息,将其放入一个proto文件中,并仅更新客户端。服务器首先应该期望任何类型,但知道。进行序列化/反序列化时要查找的原型文件或文件夹。 我读过关于“任何类

  • 问题内容: “现代” 守护程序如何在 内部 安排作业?有些人经常通过来安排一次跑步。因此,在写出crontab之后,会执行以下操作: 解析crontab以了解所有将来的事件,并hibernate间隔时间? 每分钟轮询一次汇总的crontab数据库,以确定当前时间是否与计划模式匹配? 其他? 谢谢, 问题答案: 在这个问题上听到了几声。不错的RTFC,其中包含一些离散事件模拟论文和Wikipedia

  • 问题内容: 该功能在内部如何工作?考虑到内核确实具有访问用户内存空间的特权,它是否使用任何缓冲区还是完成了任何内存映射? 问题答案: 的实现高度依赖于体系结构。 在x86和x86-64上,它只是直接从用户空间地址进行读取并写入内核空间地址,同时如果已配置,则暂时禁用SMAP(超级用户模式访问阻止)。它的棘手部分是将代码放置在特殊区域中,以便页面错误处理程序可以识别其中何时发生错误。发生的内存保护错