初始化和销毁方法,单实例的Bean会在容器创建的时候被自动调用。但是需要注意的时候,如果是多实例的配置Bean,则会在获取该实例的时候被调用。
InitMethod & destoryMethod
在注入Bean的时候,可以指定Bean的 init
和 destroy
方法,这两个方法要求是 公有的的无参构造方法
- init 方法将会在对象创建完成,成员变量赋值完成之后被创建
[x] destroy方法将会在context被关闭的时候被调用。
public class Car {
public Car() { System.out.println("Car.Car");}
public void init() { System.out.println("Car.init"); }
public void destroy() { System.out.println("Car.destroy"); }
}
// 注入Bean到IOC
@Bean(initMethod = "init",destroyMethod = "destroy")
public Car car(){
return new Car();
}
创建Spring上下文,可以看到控制台输出
public class AnnotationConfigClassPath {
AnnotationConfigApplicationContext context;
@Before
public void init() {
context = new AnnotationConfigApplicationContext(MainConfig.class);
}
@Test
public void initComplete() {
System.out.println("容器创建完成");
}
}
控制台输出日志如下:
Car.Car
Car.init
容器创建完成
Car.destroy
InitializingBean & DisposableBean 接口
除了通过在 `@Bean` 注解上添加初始化方法和销毁方法之外,也可以通过让Bean的class实现 `org.springframework.beans.factory.InitializingBean` 接口,然后实现其接口方法`afterPropertiesSet `来获得在对象创建被复制完成之后调用初始化的方法的能力,其被调用的方法为 `afterPropertiesSet()` ;通过实现 `org.springframework.beans.factory.DisposableBean` 接口,实现 `destroy` 方法来实现容器的销毁方法。
public class Car implements InitializingBean, DisposableBean {
public Car() { System.out.println("Car.Car");}
public void destroy() { System.out.println("Car.destroy"); }
@Override
public void afterPropertiesSet() throws Exception { System.out.println("Car.afterPropertiesSet"); }
}
PostConstruct & PreDestroy 注解
这两个注解属于JSR250 规范的注解,Spring这里对这两个注解提供了支持,可以在Bean中指定无参的方法添加 @PostConstruct
或者 @PreDestory
注解来实现Bean的创建和销毁的生命周期方法。
public class Car {
public Car() {
System.out.println("Car.Car");
}
@PostConstruct
public void postConstruct() {
System.out.println("Car.postConstruct");
}
@PreDestroy
public void preDestroy() throws Exception {
System.out.println("Car.preDestroy");
}
}
BeanPostProcessor 接口
从字面意思上来说,这个接口是Spring提供的Bean的后置处理器, 用于Bean的声明周期方法,此接口提供了两个方法。分别是在Bean创建完成之前,以及Bean的初始化回调方法之前或者之后调用(初始化回调方法值得是上文的多种初始化方法) ,其方法名分别为 postProcessBeforeInitialization(Object bean,String beanName)
以及 postProcessBeforeInitialization(Object bean, String beanName)
,其中的bean值得是当前class创建的bean实例,而beanName值得是当前bean在Spring容器的名称。
下面的代码是实现一个自定义的BeanPostProcessor , 需要注意的是,这个自定义的后置处理器需要被作为组件被扫描到Spring的容器中,否则不会生效,可以通过添加注解 @ComponentScan
注解方法实现
@Configurable
@ComponentScan("com.zhoutao123.spring")
public class MainConfig {}
@Component
public class CustomerBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("Car.postProcessBeforeInitialization");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("Car.postProcessAfterInitialization");
return bean;
}
}