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--初始化后方法