当前位置: 首页 > 面试题库 >

Java Spring重新创建特定的Bean

沙柏
2023-03-14
问题内容

我想在某些数据库更改后在运行时重新创建(新对象)特定的Bean(不重新启动服务器)。看起来就是这样-

@Component
public class TestClass {

    @Autowired 
    private MyShop myShop; //to be refreshed at runtime bean

    @PostConstruct //DB listeners
    public void initializeListener() throws Exception {
        //...
        // code to get listeners config
        //...

        myShop.setListenersConfig(listenersConfig);
        myShop.initialize();
    }

    public void restartListeners() {
        myShop.shutdownListeners();
        initializeListener();
    }
}

此类代码不会运行,因为myShopSpring是由Singleton创建的对象,除非重新启动服务器,否则其上下文不会刷新。如何刷新(创建一个新对象)myShop

我想到的一种不好的方法是在myShop内部创建新对象,restartListeners()但这对我来说似乎不对。


问题答案:

在DefaultListableBeanFactory中,您具有公共方法destroySingleton(“
beanName”),因此可以使用它,但是您必须知道,如果您自动装配了bean,它将保留最初自动装配的对象的相同实例。可以尝试这样的事情:

@RestController
public class MyRestController  {

        @Autowired
        SampleBean sampleBean;

        @Autowired
        ApplicationContext context;
        @Autowired
        DefaultListableBeanFactory beanFactory;

        @RequestMapping(value = "/ ")
        @ResponseBody
        public String showBean() throws Exception {

            SampleBean contextBean = (SampleBean) context.getBean("sampleBean");

            beanFactory.destroySingleton("sampleBean");

            return "Compare beans    " + sampleBean + "=="

    + contextBean;

    //while sampleBean stays the same contextBean gets recreated in the context
            }

    }

它不是很漂亮,但显示了如何实现它。如果要处理的是控制器而不是组件类,则可以在方法参数中进行注入,并且它也可以工作,因为直到在方法内部需要时才重新创建Bean,至少看起来是这样。有趣的问题是,除了首先将其自动连线到的对象外,还有谁还引用了旧Bean,因为已将其从上下文中删除,所以我想知道它是否仍然存在,或者是否在控制器中释放了该对象而进行了垃圾收集上面的内容,如果上下文中的某些其他对象引用了它,则上面的内容会引起问题。



 类似资料:
  • 问题内容: 我正在使用Spring JPA执行所有数据库操作。但是我不知道如何从Spring JPA的表中选择特定的列? 例如: 问题答案: 你可以从这样的类中在注释中进行设置: 请注意,你将不得不自己进行映射。像这样使用常规映射查找可能会更容易,除非你确实只需要这两个值: 也许也值得看一下Spring数据文档。

  • 创建新的Arraylist(如第一种方法)与创建第二种方法之间的区别是什么?在创建一个时,您考虑了什么?

  • 问题内容: 我有一个条件,即StringBuilder会不断存储与大型平面文件(100兆字节)中的模式匹配的行。但是,达到条件后,我将StringBuilder变量的内容写入文本文件。 现在我想知道是否应该通过重置对象->使用相同的变量 要么 请提出就性能和OOM问题而言您认为哪个更好。 问题答案: 我认为通话仍然很昂贵,您应该这样做: 重置它。 更新: 查看完 源代码后 ,似乎完整保留了旧缓冲区

  • 我有一个映射到视图的实体,下面是它的外观 这工作得很好,我可以使用道从视图中检索记录。然而,我在日志中注意到Hibernate实际上正在尝试创建表,但失败了,因为它已经存在。 2015-11-12 21:56:34.841错误4204---[ost-startStop-1]组织。冬眠工具hbm2ddl。SchemaExport:HHH000389:不成功:创建表user\u profile(use

  • 我的应用程序有一个放射群。它有2个单选按钮。 选择单选按钮2 转到电话设置并更改语言。 返回应用程序活动。 再次创建活动。但是选择了radiobutton2。 实际上,当我创建活动时,它应该保留radiobutton1作为默认选择。但是在改变语言并进入我的活动之后,即使运行了onCreate(),它仍然保持以前的状态。 不知何故,状态没有被清除,当我再次创建活动时,我无法将radiobutton1

  • 我目前正在开发一个使用Cassandra/Solr的项目,其中包含Java CRUD层。SolrJ(至少是我们使用的版本)不能很好地映射Cassandra UUID或TimeUUID字段,所以我看到的建议是将UUID视为POJO中的字符串,然后让getter和setter处理输入和输出转换。 多谢!