文章目录
1. Bean生命周期
1.1 @Bean注解指定初始化和销毁方法
// 使用方法: 利用@Bean的 initMethod 和 destroyMethod 属性指定相应方法的名称
@Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
initMethod() 初始化之后
destroyMethod() 销毁之前
public class User {
public User() {
System.out.println("user构造器...");
}
private String name;
private Integer age;
public void initMethod() {
System.out.println("我是initMethod...");
}
public void destroyMethod() {
System.out.println("我是destroyMethod...");
}
}
测试
@Configuration
public class MyConfig {
@Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
public User user() {
User user = new User();
return user;
}
}
@Test
public void test() {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
annotationConfigApplicationContext.getBean("user");
annotationConfigApplicationContext.close();
}
1.2 实现 InitializingBean、DisposableBean接口
InitializingBean 属性设置之后
DisposableBean 销毁之前
public class User implements InitializingBean, DisposableBean {
public User() {
System.out.println("user构造器...");
}
private String name;
private Integer age;
public void initMethod() {
System.out.println("我是initMethod...");
}
public void destroyMethod() {
System.out.println("我是destroyMethod...");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("我是afterPropertiesSet...");
}
@Override
public void destroy() throws Exception {
System.out.println("我是destroy...");
}
}
测试
@Test
public void test() {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
annotationConfigApplicationContext.getBean("user");
annotationConfigApplicationContext.close();
}
1.3 使用注解@PostConstruct 、@PreDestory
@PostConstruct 初始化之后
@PreDestory 销毁之前
public class User implements InitializingBean, DisposableBean {
public User() {
System.out.println("user构造器...");
}
private String name;
private Integer age;
public void initMethod() {
System.out.println("我是initMethod...");
}
public void destroyMethod() {
System.out.println("我是destroyMethod...");
}
@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...");
}
}
测试
@Test
public void test() {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
annotationConfigApplicationContext.getBean("user");
annotationConfigApplicationContext.close();
}
1.4 实现 BeanPostProcessor 接口
创建一个类实现 BeanPostProcessor
postProcessBeforeInitialization() 初始化之前,优先于上面三种
postProcessAfterInitialization() 初始化之后
public class MyBeanPostProcessor implements BeanPostProcessor {
/**
* 初始化之前调用
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("我是postProcessBefore... beanName=" + beanName);
return bean;
}
/**
* 初始化之后调用
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("我是postProcessAfter... beanName=" + beanName);
return bean;
}
}
通过@Bean 注册到容器中
@Configuration
public class MyConfig {
@Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
public User user() {
User user = new User();
return user;
}
@Bean
public MyBeanPostProcessor myBeanPostProcessor() {
return new MyBeanPostProcessor();
}
}
测试
@Test
public void test() {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
annotationConfigApplicationContext.getBean("user");
annotationConfigApplicationContext.close();
}