Spring中bean的执行初始化和销毁方法的4种方式详解

一、引入

在java的实际开发过程中,我们可能需要在spring实例化一个bean的过程中,使用到初始化一个对象(bean)后立即初始化(加载)一些数据,或者在销毁一个对象之前进行执行一些事情等等。
因此Spring为我们提供了一系列的方式:

方式 初始化 init 销毁destroy
1 @bean 注解,指定属性initMethod @bean 注解,指定属性destroyMethod
2 xml形式,指定 init-method xml形式,指定 destroy-method
3 实现InitializingBean接口,重写afterPropertiesSet方法 实现DisposableBean接口,重写destroy方法
4 注解@PostConstruct 注解@PreDestroy

二、方式详解

  1. @bean 注解

 @Bean(name="user",initMethod = "init",destroyMethod = "destroy")
 public User user(String name) {
     return new User(name);
 }
  1. xml形式

<bean id="user" class="com.demo.user" init-method="init" destroy-method="destroy"></bean>
  1. 接口InitializingBean和DisposableBean
    实现InitializingBean接口,重写afterPropertiesSet()方法

public interface InitializingBean {

   /**
    * Invoked by the containing {@code BeanFactory} after it has set all bean properties
    * and satisfied {@link BeanFactoryAware}, {@code ApplicationContextAware} etc.
    * 

This method allows the bean instance to perform validation of its overall * configuration and final initialization when all bean properties have been set. * @throws Exception in the event of misconfiguration (such as failure to set an * essential property) or if initialization fails for any other reason */ void afterPropertiesSet() throws Exception; }

实现DisposableBean方法,重写destroy方法

/**
 * Interface to be implemented by beans that want to release resources
 * on destruction. A BeanFactory is supposed to invoke the destroy
 * method if it disposes a cached singleton. An application context
 * is supposed to dispose all of its singletons on close.
 *
 * 

An alternative to implementing DisposableBean is specifying a custom * destroy-method, for example in an XML bean definition. * For a list of all bean lifecycle methods, see the BeanFactory javadocs. * * @author Juergen Hoeller * @since 12.08.2003 * @see org.springframework.beans.factory.support.RootBeanDefinition#getDestroyMethodName * @see org.springframework.context.ConfigurableApplicationContext#close */ public interface DisposableBean { /** * Invoked by a BeanFactory on destruction of a singleton. * @throws Exception in case of shutdown errors. * Exceptions will get logged but not rethrown to allow * other beans to release their resources too. */ void destroy() throws Exception; }

  1. @PostConstruct和@PreDestroy

//初始化后执行的方法,必须为voidlei'xing类型
 @PostConstruct
 public void init() {
 ***do someThing
 }

//bean销毁前执行的方法
@PreDestroy
public void init() {
***do someThing
}

从Java EE 5规范开始,Servlet中增加了两个影响Servlet生命周期的注解:@PostConstruct和@PreDestroy。
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。

三、总结

一)对Spring版本的要求

  • xml和实现接口的方式是Spring最原始的方式,Spring任何版本均支持

  • @PostConstruct和@PreDestroy需要Spring2.5及以上版本

  • @bean :需要Spring 3.0以上版本支持

    二)执行顺序不一样
    其中
    此处引入Spring中bean生命周期的介绍

Spring中bean的执行初始化和销毁方法的4种方式详解_第1张图片引自: 深究Spring中Bean的生命周期.

初始化之后执行顺序: @PostConstruct > InitializingBean > Beaninit-method(xml注解或者@Bean)

销毁之前执行顺序:@preDestroy > DisposableBean > destoryMethod(xml注解或者@Bean)

你可能感兴趣的:(Spring,spring,java,spring,boot,Spring中bean初始化,Spring中bean的销毁)