1.InitializingBean接口
1.1.InitializingBean接口概述
Spring中提供了一个InitializingBean接口,该接口为bean提供了属性初始化后的处理方法,它只包括afterPropertiesSet方法,凡是继承该接口的类,在bean的属性初始化后都会执行该方法。InitializingBean接口的源码如下所示
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
afterPropertiesSet()方法是在属性赋好值之后调用的。
2.DisposableBean接口
2.1.DisposableBean接口概述
实现org.springframework.beans.factory.DisposableBean接口的bean在销毁前,Spring将会调用DisposableBean接口的destroy()方法。
DisposableBean接口的源码,如下所示。
public interface DisposableBean {
void destroy() throws Exception;
}
在DisposableBean接口中只定义了一个destroy()方法。
在bean生命周期结束前调用destroy()方法做一些收尾工作,亦可以使用destroy-method。前者与Spring耦合高,使用类型强转.方法名(),效率高;后者耦合低,使用反射,效率相对来说较低。
2.2.DisposableBean接口注意事项
多实例bean的生命周期不归Spring容器来管理,这里的DisposableBean接口中的方法是由Spring容器来调用的,所以如果一个多实例bean实现了DisposableBean接口是没有啥意义的,因为相应的方法根本不会被调用,当然了,在XML配置文件中指定了destroy方法,也是没有任何意义的。所以,在多实例bean情况下,Spring是不会自动调用bean的销毁方法的。
3.单实例bean案例
创建一个Cat的类来实现InitializingBean和DisposableBean这俩接口,代码如下所示
package com.tianxia.springannotation.entity;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import java.io.Serializable;
/**
* @author liqb
* @date 2023-04-28 10:00
**/
public class Cat implements InitializingBean, DisposableBean, Serializable {
public Cat() {
System.out.println("cat constructor...");
}
/**
* 会在bean创建完成,并且属性都赋好值以后进行调用
* @author liqb
* @date 2023-04-28 10:01
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("cat afterPropertiesSet...");
}
/**
* 会在容器关闭的时候进行调用
* @author liqb
* @date 2023-04-28 10:01
* @throws Exception
*/
@Override
public void destroy() throws Exception {
System.out.println("cat destroy...");
}
}
在配置类,配置bean
/**
* 创建cat的bean对象
* @author liqb
* @date 2023-04-27 11:53
* @return
*/
@Bean
public Cat cat() {
return new Cat();
}
运行测试用例,输出的结果信息如下所示:
从输出的结果信息中可以看出,单实例bean情况下,IOC容器创建完成后,会自动调用bean的初始化方法;而在容器销毁前,会自动调用bean的销毁方法。