主要逻辑都在doCreate()方法中(context.getBean("designFactoryBean")时) getBean(beanName) 这个方法经常用来从 BeanFactory 中获取一个 Bean,而初始化的过程也封装到了这个方法里。
// 实例化阶段! instanceWrapper = createBeanInstance(beanName, mbd, args); 复制代码
触点:在factoryBean 的 doCreateBean() 方法
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方法都是在初始化阶段之前调用的!
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()
以ConfigurableApplicationContext#close()方法作为入口,实现是通过循环取所有实现了DisposableBean接口的Bean然后调用其destroy()方法