SpringBean完整生命周期我们先执行一个测试,然后在分析源码
/**
* Bean 全生命周期
*/
@Component
public class JxdSpringBean implements BeanNameAware, BeanFactoryAware,InitializingBean,DisposableBean, ApplicationContextAware {
public JxdSpringBean(){
System.out.println("1.JxdSpringBean 初始化 构造方法 ");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("3.setBeanFactory "+beanFactory);
}
@Override
public void setBeanName(String name) {
System.out.println("2.setBeanName "+name);
}
@Override
public void destroy() throws Exception {
System.out.println("8.JxdSpringBean destroy");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("6.JxdSpringBean afterPropertiesSet");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("4.JxdSpringBean ApplicationContext");
}
}
@Component
public class JxdPostProcessors implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// if(bean instanceof User)
System.out.println("5.postProcessBeforeInitialization "+beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// if(bean instanceof User)
System.out.println("7.postProcessAfterInitialization "+beanName);
return bean;
}
}
@Configuration
@Import(JxdSpringBean.class)
public class JxdSpringConfig {
}
测试类:
public class test {
private static AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(JxdSpringConfig.class);
public static void main(String[] args) {
JxdSpringBean jxdSpringBean =applicationContext.getBean("jxdSpringBean", JxdSpringBean.class);
}
}
我们看下控制台打印的情况,红框部分就是springBean生命全周期
源码时刻:
AbstractAutowireCapableBeanFactory 中 有一个方法
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
invokeAwareMethods(beanName, bean);
return null;
}, getAccessControlContext());
}
else {
invokeAwareMethods(beanName, bean); //检查Aware方法 实现的接口对应BeanNameAware, BeanFactoryAware }
//代码到这里已经执行了 bean的 构造方法
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
/**
*实现接口BeanPostProcessor,ApplicationContextAware, ApplicationContextAwareProcessor实现
*implements BeanPostProcessor 所以applyBeanPostProcessorsBeforeInitialization方法 会执行postProcessBeforeInitialization 从而会执行
*setApplicationContext
*
*/
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
try {
invokeInitMethods(beanName, wrappedBean, mbd); //bean的初始化 方法 实现的接口对应InitializingBean
}
catch (Throwable ex) {
throw new BeanCreationException(
(mbd != null ? mbd.getResourceDescription() : null),
beanName, "Invocation of init method failed", ex);
}
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);//对应BeanPostProcessor中的postProcessAfterInitialization方法
}
return wrappedBean;
}
我们看一下中间经过的方法:
1.refresh()
2. finishBeanFactoryInitialization(beanFactory);
3. beanFactory.preInstantiateSingletons();//初始化非懒加载的Bean
4.getBean(不是factoryBean 走else getBean ) -> doGetBean(第一次初始化getSigletion 等于null且是单例的 isSigletion 所以走createBean) ->createBean->doCreateBean;
5.populateBean(beanName, mbd, instanceWrapper);//(Bean 的参数赋值set方法)
6.exposedObject = initializeBean(beanName, exposedObject, mbd);// 初始化Bean