春豆破坏法,singleton和prototype作用域(Spring bean destroy-m

2019-07-20 10:30发布

我是新来的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范围豆,但不与prototype好心帮我在下面,

它是否正确? 如果是这样,这将是可能的原因是什么?

我也有类似的一些疑问,

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

Answer 1:

xmlDestroy()方法被调用单范围豆,但不是因为原型

春天不管理的原型bean的整个生命周期:容器初始化,配置,装饰或者是装配一个原型对象,将它交给客户端,然后有一个原型实例不闻不问了。 为了释放资源尽量实现自定义bean后置处理器。

不像Spring容器管理的整个生命周期的豆单

你可以看看这个基本教程针对不同上下文之间的差异

请参考文档



Answer 2:

一个singleton bean意味着在应用程序上下文中Bean的只有一个实例。 这意味着如果你做这样的事情:

HelloSpring obj = (HelloSpring) context.getBean("helloSpring");
    obj.setMessage("My message");
    System.out.printIn(obj.getMessage());
    HelloSpring anotherObj = (HelloSpring) context.getBean("helloSpring");
    System.out.printIn(anotherObj.getMessage());

您将看到控制台输出“我的信息”的两倍。

对于原型豆每次试图让那些从应用程序上下文,所以如果你运行上面的代码再第二控制台输出将是“空”,你会得到一个新的实例之一。

由于没有必要的容器呼吁原型bean中的破坏方法,它不和的行为是正确的。

上述类之间的区别是,他们是一个接口,一个抽象类,分别为一个具体的类,以了解有关该概念我建议您阅读在这里Java的Oracle官方文档更好的Oracle Java教程 。



Answer 3:

这是预期的行为。 有没有办法春季知道,当你已经使用了原型范围豆成品,所以豆的破坏不是由Spring为原型作用域bean管理。 从文档:

虽然初始化生命周期回调方法的调用上,无论范围内的所有物体,在原型的情况下,配置毁灭生命周期回调不叫。

见Spring文档以获取更多信息。

至于ApplicationContext S,你可以选择最适合你的应用程序中的一个。 这取决于你是否要使用XML或注解bean配置,以及你是否在一个servlet容器中运行,例如。 ApplicationContext本身是在类型层次结构的根目录的接口。



Answer 4:

您的应用程序可以要求原型豆每10毫秒的新情况下,做一些与bean,然后让它走出去的范围。 如果春天已经销毁()他们当应用程序关闭,那就得参考保持到每一个创建bean原型,防止他们被垃圾收集,从而导致内存泄漏。



Answer 5:

我也试图让豆的破坏事件,这是范围“原型”。 所以,我读了所有的答案上面,并通过他们的答案尝试。 在结果,我伸出手,有没有方法来检测破坏甚至bean原型。

虽然初始化生命周期回调方法的调用上,无论范围内的所有物体,在原型的情况下,配置毁灭生命周期回调不叫。

看到这里( https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/beans.html#beans-factory-scopes-prototype )



Answer 6:

请将您的Spring配置文件检查的范围类型。 如果范围=“原型”,然后将其更改为范围=“单身”

<bean id="helloWorld" class="com.example.test.HelloWorld"
init-method="init" destroy-method="destroy">
<property name="message" value="Hello World!" />



文章来源: Spring bean destroy-method , singleton and prototype scopes