Bean 生命周期
初始化与销毁
使用@Bean时指定
指定initMethod 和 destroyMethod 来指定相对应的初始化方法跟销毁方法。
值得注意的是,销毁方法只有在Bean是单例的时候才会执行。
InitializingBean&DisposableBean接口
public class Man implements InitializingBean, DisposableBean {
public Man() {
System.out.println("调用无参构造器创建Man");
}
@Override
public void destroy() {
System.out.println("销毁Man");
}
@Override
public void afterPropertiesSet() {
System.out.println("初始化Man");
}
}
@PostConstruct&@PreDestroy
这两个注解非Spring提供,由JSR250定义
@Component
public class Bean {
//创建后执行
@PostConstruct
public void init(){ System.out.println("init"); }
//销毁前执行
@PreDestroy
public void destroy(){ System.out.println("destroy"); }
}
BeanPostProcessor
该接口定义了两个方法,为Spring定义的扩展点,实现该接口,所有Bean在初始化前后都会调用这个钩子,我们可根据自定义处理
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + " 初始化之前调用");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + " 初始化之后调用");
return bean;
}
}
InstantiationAwareBeanPostProcessor
Bean实例化钩子
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
// 可在该方法自定义Bean实例化过程 若返回null就代表走默认的实例化过程
default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
return null;
}
// 若上方的方法不返回null 该方法不会被调用
// 该方法若返回false 不会调用下面的属性值处理方法
default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
return true;
}
@Nullable
default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
throws BeansException {
return null;
}
}
BeanFactoryPostProcessor
该钩子会在Bean定义加载完成后、Bean实例化前被调用,通常用于修改bean的定义,Bean的属性值等。
BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法执行时机先于BeanFactoryPostProcessor的postProcessBeanFactory方法