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

Spring bean的破坏方法,单例和原型作用域

林星阑
2023-03-14
问题内容

我是spring框架的新手,从一些教程开始学习它。

我有以下文件,

#MainProgram.java

package test.spring;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainProgram {
        public static void main(String[] args) {
              AbstractApplicationContext context = 
                              new ClassPathXmlApplicationContext("Bean.xml");     
              HelloSpring obj = (HelloSpring) context.getBean("helloSpring");
              obj.setMessage("My message");
              obj.getMessage();
              context.registerShutdownHook();

        }
 }

#HelloSpring.java

package test.spring;

public class HelloSpring   {
     private String message;

     public void setMessage(String message){
      this.message  = message;
      System.out.println("Inside setMessage");
   }

   public void getMessage(){
      System.out.println("Your Message : " + this.message);
   }

   public void xmlInit() {
    System.out.println("xml configured  initialize");
   }

    public void xmlDestroy() {
    System.out.println("xml configured destroy");
    }

  }

#Bean.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

     <bean id="helloSpring" class="test.spring.HelloSpring" 
          scope="prototype" init-method="xmlInit" destroy-method="xmlDestroy">

     </bean>
     </beans>

当我把scope="singleton" 我的输出是:

 xml configured  initialize
 Inside setMessage
 Your Message : My message
 xml configured destroy

当我把scope="prototype" 我的输出是:

 xml configured  initialize
 Inside setMessage
 Your Message : My message

xmlDestroy()方法是用singleton作用域bean 调用的,但不能prototype 在以下方面为我提供帮助,

这样对吗?如果是这样,可能是什么原因?

我也有一些疑问,

之间的区别或关系是什么 ApplicationContext , AbstractApplicationContext and ClassPathXmlApplicationContext


问题答案:

xmlDestroy() 用singleton范围bean调用该方法,而不用原型调用,因为

Spring不能管理原型bean的完整生命周期:容器实例化,配置,修饰和以其他方式组装原型对象,将其交给客户端,然后对该原型实例不再有任何了解。为了释放资源,请尝试实现自定义bean
post处理器。

单例豆不同,弹簧容器管理着整个生命周期

您可以查看此基础教程,了解不同上下文之间的差异

参考文档



 类似资料:
  • 问题内容: 我在页面上添加了一个简单的文件,该文件在和原型中添加了一些非常普通的常见任务功能。 经过反复试验,我发现向,添加任何函数,无论其名称或功能如何都会导致jQuery中的Javascript错误: 罪魁祸首? 我在attr:function {}声明中得到的第1056行的错误: 显然G.replace是未定义的。 很明显,有些事情我只是没有用原型制作而已,但我很痛苦地未能弄清楚它是什么。

  • 问题内容: 我正在研究单例,并且已经开发了非常基本的单例类。 现在下面是我破解单例的一种方法。 请也建议其他方法可以使单例破裂.. !! 问题答案: 我可以想到的三种方法是: 序列化 如果您的单例类是可序列化的,则可以序列化它的一个实例,然后反序列化它,以获得该类的第二个对象。 您可以通过实现readResolve方法来避免这种情况。 类加载 可以由两个不同的类加载器加载同一个类,这样,您可以通过

  • 假设有两个类ClassA和ClassB。假设ClassB依赖于ClassA。在配置文件中,如果我们将ClassA的作用域定义为singleton,而将ClassB的作用域定义为Prototype,那么每次创建ClassA的bean实例时ClassB的实例会发生什么?每次返回ClassA实例时,会返回相同的ClassB实例还是创建新实例? 谢谢!!!

  • 在实际应用中,destroy方法的可能示例是什么?为什么一个正在运行的应用程序想要销毁它的bean?如果bean是由spring容器(比如ContextLoaderListener)为web应用程序创建的,那么如何重新创建这些bean,因为容器已经启动了。有没有办法在不重启应用服务器的情况下重启spring IoC容器?

  • 问题内容: 我知道,在同一句子中使用JavaScript和’atomic’一词有点奇怪,因为JavaScript被认为是异步的,因此不是很原子。 //编辑这是我的错误!通过关闭警报(并在chrome中隐藏其他警报),警报迅速中断并让其他代码运行。JavaScript是单线程的。 快速- >实际问题; 在哪种情况下,我们可以从异步回调中断中保存代码,如何防止某些代码块使用它们? 长- >我的场景;

  • 本文向大家介绍JS原型和原型链原理与用法实例详解,包括了JS原型和原型链原理与用法实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS原型和原型链原理与用法。分享给大家供大家参考,具体如下: Javascript语言的继承机制一直很难被人理解。 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instance)的区分,全靠一种很奇特的"原型链"(prototy