spring学习9-bean的初始化过程
目录
三、spring bean的初始化过程
1.得到BeanDefinition
2.实例化前
org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
3.实例化
4.实例化后
org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
实例化后这个方法如果返回了false,就不会走后续的spring逻辑
5.属性填充
这个阶段进行自动装配,属性赋值
6.初始化前
org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization
这个方法如果返回了null,表示跳过其余的BeanPostProcessor处理逻辑,一搬情况这里应该返回当前的bean对象
7.初始化
spring提供了一个接口InitializingBean
,实现这个接口中的afterPropertiesSet()
方法来实现初始化逻辑
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
@PostConstruct注解也可以实现初始化,这个注解的处理是在初始化前进行处理的。
属性注入完成后才会执行初始化
8.初始化后
重写这个方法
org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization
通过bean的后置处理器BeanPostProcessor
及其子接口对这个过程进行干预
9.自定义后置处理器举例
@Component
public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
if (beanClass.getName().equals("com.lyy.service.UserService")) {
System.out.println("UserService--实例化前方法");
}
return null;
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
if (bean.getClass().getName().equals("com.lyy.service.UserService")) {
System.out.println("UserService--实例化后方法");
//return false;//return false表示跳过后续的spring逻辑
}
return true;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean.getClass().getName().equals("com.lyy.service.UserService")) {
System.out.println("UserService--初始化前方法");
//return null;//return null表示跳过后续的处理器处理逻辑
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (beanName.equalsIgnoreCase("UserService")) {
System.out.println("UserService--初始化后方法");
}
return bean;
}
}
执行顺序
UserService--实例化前方法
UserService--无参构造方法
UserService--实例化后方法
UserService--set方法注入
UserService--初始化前方法
UserService--PostConstruct注解初始化
UserService--初始化方法
UserService--初始化后方法