1 Bean的初始化和销毁方法
Bean的生命周期分为创建、属性设置、初始化和销毁。在每个步骤我们可以定义自己的方法来执行一些代码逻辑。
1.1 Bean实例化时的方法
类构造器
1.2 Bean属性设置后调用的方法
实现org.springframework.beans.factory.InitializingBean
接口中的afterPropertiesSet方法,在bean属性设置结束后会执行本方法。
1.3 bean初始化方法
1.3.1 BeanPostProcessor接口
- 实现BeanPostProcessor接口中的postProcessBeforeInitialization方法,本方法将会在bean初始化前调用。
- 实现BeanPostProcessor接口中的postProcessAfterInitialization方法,本方法将会在bean初始化结束后调用。
1.3.2 @PostConstruct注解
在bean中被@PostConstruct注解标注的方法将会在初始化前被调用,但是它会在postProcessBeforeInitialization方法后被调用。
1.3.3 自定义在bean中的初始化方法
在bean中自行定义一个初始化时执行的方法,在bean配置类的@Bean注解中给initMethod属性赋值为自定义方法的名字即可。
1.4 Bean的销毁方法
1.4.1 @PreDestroy方法
在bean中被@PreDestroy注解标注的方法将会在销毁前调用。
1.4.2 DisposableBean接口
实现org.springframework.beans.factory.DisposableBean
接口中的destroy方法
1.4.3 自定义在bean中的销毁方法
在bean中自行定义一个销毁时执行的方法,在bean配置类的@Bean注解中给destroyMethod属性赋值为自定义方法的名字即可。
2 自定义初始化和销毁方法的执行步骤
创建和初始化
- 执行构造器
- 执行postProcessBeforeInitialization方法
- 执行在bean中被@PostConstruct注解的方法
- 执行afterPropertiesSet方法
- 执行自定义在bean中的初始化方法
- 执行postProcessAfterInitialization方法
销毁
- 执行在bean中被@PreDestroy注解的方法
- 执行destroy方法
- 执行自定义在bean中的销毁方法
代码演示
创建一个bean叫User,并实现InitializingBean和DisposableBean接口并重写其中的方法,编写无参构造器,编写被@PostConstruct和@PreDestroy注解的方法,编写自定义的初始化和销毁方法。
package cc.fireflyhut.selftech.bean;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class User implements InitializingBean, DisposableBean {
private String username;
public User() {
System.out.println("执行构造器...");
}
/**
* 自定义初始化时执行的方法
*/
public void init() {
System.out.println("执行自定义的init方法...");
}
/**
* 自定义销毁时执行的方法
*/
public void myDestroy() {
System.out.println("执行自定义的myDestroy方法...");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("执行afterPropertiesSet方法...");
}
@Override
public void destroy() throws Exception {
System.out.println("执行destroy方法...");
}
@PostConstruct
public void postConstruct() {
System.out.println("执行postConstruct方法...");
}
@PreDestroy
public void preDestroy() {
System.out.println("执行preDestroy方法...");
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
创建一个Process类实现BeanPostProcessor接口并重写其中的方法
package cc.fireflyhut.selftech.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
@Component
public class MyProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + "执行postProcessBeforeInitialization方法...");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + "执行postProcessAfterInitialization方法...");
return bean;
}
}
创建一个Config类来生成User对象
package cc.fireflyhut.selftech.bean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BeanConfig {
@Bean(initMethod = "init", destroyMethod = "myDestroy")
public User user() {
return new User();
}
}
编写测试类执行bean初始化和销毁过程
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestBean {
@Test
public void testtest() {
AnnotationConfigApplicationContext applicationContext =
new AnnotationConfigApplicationContext("cc.fireflyhut.selftech.bean");
User user = applicationContext.getBean(User.class);
System.out.println();
applicationContext.close();
}
}
如图红框中就是名为user的Bean从创建到销毁的过程。