主要逻辑都在doCreate()方法中(context.getBean("designFactoryBean")时) getBean(beanName) 这个方法常常用来从 BeanFactory 中获取一个 Bean,而初始化的过程也封装到了这个方法里。bash
// 实例化阶段!
instanceWrapper = createBeanInstance(beanName, mbd, args);
复制代码
触点:在factoryBean 的 doCreateBean() 方法app
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
......
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
if (bean != null) {
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
......
}
复制代码
postProcessBeforeInstantiation接口的Before在doCreateBean以前调用,也就是在bean实例化以前调用的,英文源码注释解释道该方法的返回值会替换本来的Bean做为代理,这也是Aop等功能实现的关键点。源码分析
createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args)
执行顺序
Constructor构造方法 --> @PostConstruct注解标记的方法
复制代码
// 属性赋值阶段!
populateBean(beanName, mbd, instanceWrapper);
复制代码
protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
......
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
continueWithPropertyPopulation = false;
break;
}
}
}
}
......
}
复制代码
// 初始化阶段!
exposedObject = initializeBean(beanName, exposedObject, mbd);
复制代码
无所不知的Aware。 Aware类型的接口的做用就是让咱们可以拿到Spring容器中的一些资源。基本都可以见名知意,Aware以前的名字就是能够拿到什么资源,例如BeanNameAware能够拿到BeanName,以此类推。调用时机须要注意:全部的Aware方法都是在初始化阶段以前调用的!post
protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
......
// 这里调用的是三个Bean开头的Aware: BeanNameAware、BeanClassLoaderAware、BeanFactoryAware
invokeAwareMethods(beanName, bean);
......
// 这里调用的是EnvironmentAware、EmbeddedValueResolverAware、ApplicationContextAware
// 借助 BeanPostProcessor#postProcessBeforeInitialization()实现的invokeAwareInterfaces。(ApplicationContextAwareProcessor)
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
......
try {
invokeInitMethods(beanName, wrappedBean, mbd);
}
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);
}
return wrappedBean;
}
复制代码
if (mbd == null || !mbd.isSynthetic()) {
//若是其中某一个后置处理器返回为null,则后续的后置处理器将再也不调用,而直接返回
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
复制代码
// invokeInitMethods方法中
((InitializingBean) bean).afterPropertiesSet()
复制代码
// 调用自定义的init-method 方法(xml中配置的,或@Bean注解中配置的)
invokeCustomInitMethod(beanName, bean, mbd);
复制代码
if (mbd == null || !mbd.isSynthetic()) {
//若是其中某一个后置处理器返回为null,则后续的后置处理器将再也不调用,而直接返回
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
复制代码
在容器关闭时调用的,详见ConfigurableApplicationContext#close()ui
以ConfigurableApplicationContext#close()方法做为入口,实现是经过循环取全部实现了DisposableBean接口的Bean而后调用其destroy()方法spa
执行顺序
@PreDestroy --> DisposableBean --> destroy-method
复制代码
~ end3d