bean的生命周期:创建—-初始化—-销毁。
Spring中声明的Bean的初始化和销毁方法有4种方式:
- @Bean的注解的initMethod、DestroyMethod属性
- bean实现InitializingBean、DisposableBean接口
- @PostConstruct、@PreDestroy注解
- BeanPostProcessor(这种仅仅增强了Bean的初始化方法)
@Bean的注解的initMethod、DestroyMethod属性
cat类
public class Cat {
public Cat() {
System.out.println("cat...constructor...");
}
public void init() {
System.out.println("cat...init...");
}
public void destroy() {
System.out.println("cat...destory...");
}
}
配置类
@Configuration
public class SpringConfig {
@Bean(name = "cat", initMethod = "init", destroyMethod = "destroy")
public Cat getCat() {
return new Cat();
}
}
测试代码
@Test
public void testLifeCycle() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
System.out.println("IOC容器创建了...");
context.close();
}
测试结果
实现InitializingBean、DisposableBean接口
实现InitialzingBean
接口的afterPropertiesSet
方法,即为bean的初始化方法。
实现DisposableBean
接口的destroy
方法,即为bean的销毁方法。
dog类
public class Dog implements InitializingBean, DisposableBean {
public Dog() {
System.out.println("dog...constructor...");
}
// Dog类的初始化方法
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("dog...afterPropertiesSet...");
}
// Dog类的销毁方法
@Override
public void destroy() throws Exception {
System.out.println("dog...destroy...");
}
}
配置类
@Configuration
public class SpringConfig {
@Bean(name = "dog")
public Dog getDog() {
return new Dog();
}
}
测试代码
@Test
public void testLifeCycle() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
System.out.println("IOC容器创建了...");
context.close();
}
测试结果
@PostConstruct、@PreDestroy注解
这两个注解只能标注在方法上,并且@PostConstruct
注解标注的方法为bean的初始化方法,@PreDestroy
标注的方法为bean的销毁方法。
tiger类
public class Tiger {
public Tiger() {
System.out.println("tiger...constructor");
}
@PostConstruct
public void init() {
System.out.println("tiger...init...");
}
@PreDestroy
public void destroy() {
System.out.println("tiger...destroy...");
}
}
配置类
@Configuration
public class SpringConfig {
@Bean(name = "tiger")
public Tiger getTiger() {
return new Tiger();
}
}
测试代码
@Test
public void testLifeCycle() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
System.out.println("IOC容器创建了...");
context.close();
}
测试结果
实现BeanPostProcessor
BeanPostProcessor
是一个接口,这个接口中的postProcessBeforeInitialization
、postProcessAfterInitialization
方法分别在Bean的初始化方法执行的前后执行,本质上不算是声明Bean的初始化和销毁方法的一种,而是仅仅对bean的初始化方法的一个功能增强,并且在Spring中使用非常广泛,例如DI注解Autowired,当IOC容器调用无参构造创建对象之后,就会进行依赖注入,而且依赖注入在Bean的初始化方法执行之前,所以可以适用BeanPostProcessor来完成这一功能,Spring底层也是这么完成的。
MyBeanPostProcessor
public class MyBeanPostProcessor implements BeanPostProcessor {
/**
* 在初始化之前执行
* @param bean 初始化的bean
* @param beanName bean的名字
* @return 初始化的bean或者包装过的bean
* @throws BeansException
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + " ==> " + "postProcessBeforeInitialization...");
return bean;
}
/**
* 在初始化之后执行
* @param bean 初始化的bean
* @param beanName bean的名字
* @return 初始化的bean或者包装过的bean
* @throws BeansException
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + " ==> " + "postProcessAfterInitialization...");
return bean;
}
}
配置类
@Configuration
public class SpringConfig {
@Bean(name = "tiger")
public Tiger getTiger() {
return new Tiger();
}
@Bean(name = "myBeanPostProcessor")
public MyBeanPostProcessor getMyBeanPostProcessor() {
return new MyBeanPostProcessor();
}
}
测试代码
@Test
public void testLifeCycle() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
System.out.println("IOC容器创建了...");
context.close();
}
测试结果