`

Spring中的destroy-method

 
阅读更多
究竟Spring在何时调用destroy-method="close" 这个方法close()呢?终于借助JavaEye找到了答案,原来如果Spring不在Web Container或是EJB Container中的时候,这个方法还是需要我们自己来调用的,具体就是调用BeanFactory的destroySingletons()方法,文档上的“自动调用”这几个字真是害我不浅呀,原来自动也是通过Web Container或是EJB Container才可以自动,具体做法就是要实现ServletContextListener这个接口,Spring中已经有具体的实现了:
public class ContextLoaderListener implements ServletContextListener {

private ContextLoader contextLoader;

/**
* Initialize the root web application context.
*/

public void contextInitialized(ServletContextEvent event) {
this.contextLoader = createContextLoader();
this.contextLoader.initWebApplicationContext(event.getServletContext());
}

/**
* Create the ContextLoader to use. Can be overridden in subclasses.
* @return the new ContextLoader
*/

protected ContextLoader createContextLoader() {
return new ContextLoader();
}

/**
* Return the ContextLoader used by this listener.
*/

public ContextLoader getContextLoader() {
return contextLoader;
}

/**
* Close the root web application context.
*/

public void contextDestroyed(ServletContextEvent event) {
this.contextLoader.closeWebApplicationContext(event.getServletContext());
}

}
当tomcat关闭的时候会自动调用contextDestroyed(ServletContextEvent event)这个方法。在看一下contextLoader的closeWebApplicationContext方法:
public void closeWebApplicationContext(ServletContext servletContext) throws ApplicationContextException {
servletContext.log("Closing root WebApplicationContext");
Object wac = servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
if (wac instanceof ConfigurableApplicationContext) {
((ConfigurableApplicationContext) wac).close();
}
}
AbstractApplicationContext.Close这个方法是要你自己调用的,在程序要结束的时候保证调用这个close方法,在这里的话就是由Listener来保证tomcat退出的时候调用close方法。
AbstractApplicationContext.Close的代码 :
public void close() {
logger.info("Closing application context [" + getDisplayName() + "]");

// Destroy all cached singletons in this context,
// invoking DisposableBean.destroy and/or "destroy-method".
getBeanFactory().destroySingletons();

// publish corresponding event
publishEvent(new ContextClosedEvent(this));
}

最终还是调用到了getBeanFactory().destroySingletons(); 看来,没有容器,我们还是需要自己来搞定这个方法的调用的 !

- 作者: hpq852 2004年12月28日, 星期二 18:07

 

 

举个例子,ContextLoaderListener的源代码,
我们知道,如果要在tomcat里面使用spring的话需要这个Listener(或者ContextLoaderServlet)

代码
 public class ContextLoaderListener implements ServletContextListener {

private ContextLoader contextLoader;

/** * Initialize the root web application context. */ public void contextInitialized(ServletContextEvent event) { this.contextLoader = createContextLoader(); this.contextLoader.initWebApplicationContext(event.getServletContext()); }

/** * Create the ContextLoader to use. Can be overridden in subclasses. * @return the new ContextLoader */ protected ContextLoader createContextLoader() { return new ContextLoader(); }

/** * Return the ContextLoader used by this listener. */ public ContextLoader getContextLoader() { return contextLoader; }

/** * Close the root web application context. */ public void contextDestroyed(ServletContextEvent event) { this.contextLoader.closeWebApplicationContext(event.getServletContext()); }

}


当tomcat关闭的时候会自动调用contextDestroyed(ServletContextEvent event)这个方法。在看一下contextLoader的closeWebApplicationContext方法:

代码
 	public void closeWebApplicationContext(ServletContext servletContext) throws ApplicationContextException {

		servletContext.log("Closing root WebApplicationContext");

		Object wac = servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

		if (wac instanceof ConfigurableApplicationContext) {

			((ConfigurableApplicationContext) wac).close();

		}

	}


就应该明白文档里面是什么意思了,AbstractApplicationContext.Close这个方法是要你自己调用的,在程序要结束的时候保证调用这个close方法,在这里的话就是由Listener来保证tomcat退出的时候调用close方法。
AbstractApplicationContext.Close的代码

代码

 

 	public void close() {

		logger.info("Closing application context [" + getDisplayName() + "]");

 

// Destroy all cached singletons in this context, // invoking DisposableBean.destroy and/or "destroy-method". getBeanFactory().destroySingletons();

其实就是调用context里面的beanFactory的destroySingletons()方法了,这个没什么好说的。我的意思就是,容器本身不知道什么时候要shutdown了,这个消息是要靠外部(程序员)来提供的。

 

 

// publish corresponding event publishEvent(new ContextClosedEvent(this)); }

 

spring的说明中有这样一句话,我大致翻译了一下:

“对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个 prototype bean的整个生命周期负责:容器在初始化、
配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,
容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。
清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责.”
分享到:
评论
1 楼 kuchaguangjie 2014-03-22  
great!

相关推荐

    spring-context-4.2.xsd.zip

    此外,`<bean>`元素还支持通过`init-method`和`destroy-method`属性指定bean的初始化和销毁方法,以进行自定义的生命周期管理。 `spring-context-4.2.xsd`还定义了处理bean作用域(scope)、AOP代理(proxy)、事件...

    spring-jdbc-4.2.xsd.zip

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <!-- 数据源配置 --> <!-- 配置JdbcTemplate --> <bean id="jdbcTemplate" class="org.springframework....

    spring-2.0.8-sources.jar.zip

    2.0.8版本的Bean工厂支持了更丰富的生命周期回调方法,如init-method和destroy-method,使开发者能更好地控制Bean的初始化和销毁过程。 七、JDBC和ORM支持 Spring 2.0.8加强了对JDBC的抽象,提供了JdbcTemplate和...

    架构师面试题系列之Spring面试专题及答案(41题).docx

    Spring 框架生命周期和 Bean 实例化过程 Spring 框架是一个非常流行的 Java Web 应用...同时,init-method 和 destroy-method 属性、BeanPostProcessor 接口也是非常重要的概念,它们可以用来动态扩展和修改 Bean。

    Spring-MyBatis-Ajax重点详解

    Spring 表达式是在配置文件中使用的,用于读取 Bean 对象或者集合中的值。用#{ id.属性}。 自动装配是 Spring 的一项功能,可以按照名字或类型进行装配。使用 @Autowired 注解,可以按照名字或类型进行装配。如果...

    spring-2.5.6源码

    2.5.6版本支持Bean的生命周期回调方法,如初始化方法(init-method)和销毁方法(destroy-method),以及自定义的生命周期处理器。 五、Spring的IoC容器 IoC容器是Spring的核心,负责管理Bean的实例化、配置和组装...

    Spring--2.Spring 中的 Bean 配置-2-1

    本节我们将深入探讨Spring中的Bean配置,主要聚焦在XML配置方式,因为这是Spring早期版本中最常用的方式,尽管在现代Spring应用中,Java配置和注解配置变得更为常见。 1. **Bean定义**: - 在Spring中,一个Bean...

    开源框架spring详解-----spring对JDBC的支持

    <bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="url" value="jdbc:mysql:///spring" /> ``` 集成第三方连接池后,可以更高效地管理...

    spring笔记

    总的来说,理解Spring配置文件中的bean定义,以及`init-method`、`destroy-method`的使用,对于有效地管理对象的生命周期至关重要。同时,掌握`@ModelAttribute`在Spring MVC中的工作原理,可以帮助我们更高效地进行...

    spring-framework-3.2.10.RELEASE 源码

    开发者可以通过实现InitializingBean接口、定义init-method属性、使用@PostConstruct注解来控制初始化,通过 DisposableBean接口、destroy-method属性、@PreDestroy注解来控制销毁。 五、Spring MVC Spring MVC是...

    spring-beans

    初始化阶段可以调用`init-method`指定的方法,销毁阶段则调用`destroy-method`指定的方法。此外,Spring提供了多种扩展点,如 BeanPostProcessor 和 InstantiationAwareBeanPostProcessor,允许自定义处理Bean的创建...

    Spring.pdf

    值得注意的是,Spring 2.5版本后引入了注解的方式,可以使用@PostConstruct和@PreDestroy来代替XML中的init-method和destroy-method,从而更简洁地指定Bean的初始化和销毁方法。 容器本身也具备了极高的扩展性,...

    Spring--2.Spring 中的 Bean 配置-1

    在XML中,可以使用`init-method`和`destroy-method`属性指定。对于注解配置,可以使用`@PostConstruct`和`@PreDestroy`注解。 5. **依赖注入**: Spring的核心特性之一就是依赖注入(Dependency Injection,DI)。它...

    基于IDEA的SSH项目之二:配置Spring一---程序包

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> ``` 5. **配置事务管理器**:Spring支持声明式事务管理,我们可以在`applicationContext.xml`中配置...

    Spring--2.Spring 中的 Bean 配置-3

    此外,Bean的初始化和销毁方法可以使用`init-method`和`destroy-method`属性(在XML中)或`@PostConstruct`和`@PreDestroy`注解(在Java或注解配置中)来定义。这些方法会在Bean生命周期的特定时刻被调用。 最后,...

    Spring配置文件spring-context.zip

    5. `init-method`和`destroy-method`:指定bean初始化和销毁时要调用的方法。 6. `<import>`:引入其他配置文件,方便模块化和复用。 7. `<context:component-scan>`:通过注解扫描特定包下的类,自动发现并注册带...

    spring-demo10-注解-IOC.zip

    6. `@PostConstruct` 和 `@PreDestroy`:这两个注解标记方法在bean初始化后和销毁前执行,类似于XML配置中的 `<init-method>` 和 `<destroy-method>`。 7. `@Configuration` 和 `@Bean`:这两个注解用于替代传统的...

    spring入门学习-3、Bean装配(XML).pdf

    <bean id="beanLifeCycle" class="com.base.java.test.BeanLifeCycle" init-method="beanInit" destroy-method="beanDestory"> ``` - **实现接口方式** 实现`InitializingBean`和`DisposableBean`接口,分别...

    14、加载spring启动首先进入的类方法注解1

    在Spring的XML配置文件中,我们可以使用`init-method`和`destroy-method`属性来指定初始化和销毁的方法。例如: ```xml init-method="init" destroy-method="dostory"/> ``` 这样的配置将会确保在Bean创建时...

    08-IoC配置-bean的生命周期控制

    Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务。 Spring IOC容器对Bean的生命周期...在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法。

Global site tag (gtag.js) - Google Analytics