春豆销毁方法、单例和原型示波器

2022-09-01 20:15:50

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

我有以下文件,

# 主程序.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();

        }
 }

# 你好,弹簧.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");
    }

  }

# 豆.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()方法调用范围bean,但不是善意地帮助我进行以下操作,singletonprototype

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

我也有一些疑问,

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


答案 1

xmlDestroy()方法使用单例作用域 Bean 调用,但不使用原型,因为

Spring不管理原型bean的整个生命周期:容器实例化,配置,装饰和以其他方式组装原型对象,将其交给客户端,然后对该原型实例没有进一步的了解。要释放资源,请尝试实现自定义 Bean 后处理器。

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

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

参考文档


答案 2

这是预期的行为。Spring无法知道您何时完成了原型范围Bean的使用,因此Spring不会为原型范围Bean管理Bean的销毁。从文档中:

尽管无论作用域如何,都会在所有对象上调用初始化生命周期回调方法,但对于原型,不会调用配置的销毁生命周期回调。

有关详细信息,请参阅 Spring 文档

关于 s,您可以选择最适合您的应用的那个。例如,这取决于您是要使用 XML 还是注释 Bean 配置,以及是否在 Servlet 容器中运行。 本身是类型层次结构根部的接口。ApplicationContextApplicationContext