Spring关于Bean的生命周期
Bean常用实现接口
- BeanNameAware
void setBeanName(String name);
设置bean的名字
- BeanFactoryAware
void setBeanFactory(BeanFactory beanFactory) throws BeansException;
设置bean的bean工厂
- InitializingBean
void afterPropertiesSet() throws Exception;
属性设置之后额外的设置
- DisposableBean
void destroy() throws Exception;
销毁方法,资源释放
针对所有Bean的处理
- BeanPostProcessor
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
- InstantiationAwareBeanPostProcessor,继承自BeanPostProcessor接口,是它的子接口,扩展了两个方法
@Nullable
default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
return null;
}
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;
}
自定义一个BeanPostProcessor
@Component
public class HelloBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof HelloUtil) {
System.out.println("*****BeanPostProcessor.postProcessBeforeInitialization方法");
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof HelloUtil) {
System.out.println("*****BeanPostProcessor.postProcessAfterInitialization方法");
}
return bean;
}
}
自定义一个InstantiationAwareBeanPostProcessor
@Component
public class HelloInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof HelloUtil) {
System.out.println("*****InstantiationAwareBeanPostProcessor.postProcessBeforeInitialization方法");
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof HelloUtil) {
System.out.println("*****InstantiationAwareBeanPostProcessor.postProcessAfterInitialization方法");
}
return bean;
}
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
if (beanClass == HelloUtil.class) {
System.out.println("*****InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法");
}
return null;
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
if (bean instanceof HelloUtil) {
System.out.println("*****InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation方法");
}
return true;
}
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
if (bean instanceof HelloUtil) {
System.out.println("*****InstantiationAwareBeanPostProcessor.postProcessProperties方法");
}
return pvs;
}
}
自定义一个实现相关接口的Bean
public class HelloUtil implements BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("*****set方法");
this.name = name;
}
public HelloUtil() {
System.out.println("*****默认构造方法");
}
@PostConstruct
public void init() {
System.out.println("*****PostConstruct方法");
}
@PreDestroy
public void preDestroy() {
System.out.println("*****PreDestroy方法");
}
@Override
public void setBeanName(String name) {
System.out.println("*****BeanNameAware.setBeanName方法");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("*****BeanFactoryAware.setBeanFactory方法");
}
@Override
public void destroy() throws Exception {
System.out.println("*****DisposableBean.destroy方法");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("*****InitializingBean.afterPropertiesSet方法");
}
}
运行测试
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);
HelloUtil helloUtil = context.getBean(HelloUtil.class);
System.out.println(helloUtil.getName());
context.close();
}
结果输出
*****InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法
*****默认构造方法
*****set方法
*****InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation方法
*****InstantiationAwareBeanPostProcessor.postProcessProperties方法(InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation返回为true才调用)
*****BeanNameAware.setBeanName方法
*****BeanFactoryAware.setBeanFactory方法
*****BeanPostProcessor.postProcessBeforeInitialization方法
*****InstantiationAwareBeanPostProcessor.postProcessBeforeInitialization方法
*****PostConstruct方法
*****InitializingBean.afterPropertiesSet方法
*****BeanPostProcessor.postProcessAfterInitialization方法
*****InstantiationAwareBeanPostProcessor.postProcessAfterInitialization方法
Hello World
*****PreDestroy方法
*****DisposableBean.destroy方法
源码位置
https://gitee.com/ceclar123/spring-boot-demo/tree/master/ch03