导图
整体流程图

故事的小黄花.从AnnotationConfigApplicationContext的第十六步开始:
接下来调用
// Instantiate all remaining (non-lazy-init) singletons.beanFactory.preInstantiateSingletons();
看看整体图
然后进入DefaultListableBeanFactory(BeanFactory),看看我们自定义的初始化函数在什么时候执行
public class DefaultListableBeanFactory{/*** Ensure that all non-lazy-init singletons are instantiated, also considering* {@link org.springframework.beans.factory.FactoryBean FactoryBeans}.* Typically invoked at the end of factory setup, if desired.* Note: This may have left the factory with some beans already initialized!* Call {@link #destroySingletons()} for full cleanup in this case.* @see #destroySingletons()*/public void preInstantiateSingletons() throws BeansException {// Trigger initialization of all non-lazy singleton beans...if (isFactoryBean(beanName)) {Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);if (bean instanceof FactoryBean) {}else{getBean(beanName);}// Trigger post-initialization callback for all applicable beans...}//Implementation of BeanFactory interface 原始@Overridepublic Object getBean(String name) throws BeansException {return doGetBean(name, null, null, false);}/*** Return an instance, which may be shared or independent, of the specified bean.* @return an instance of the bean* @throws BeansException if the bean could not be created*/protected <T> T doGetBean(/*** 1.Eagerly check singleton cache for manually registered singletons. 是否缓存中有了(手动注册)* 2.缓存没有* 2.1// We're assumably within a circular reference.处理循环引用2.2 Check if bean definition exists in this factory.检查定义在工厂2.3Guarantee initialization of beans that the current bean depends on.确保依赖都已经有了2.4真正创建逻辑getSingleton*/// Create bean instance.if (mbd.isSingleton()) {sharedInstance = getSingleton(beanName, () -> {try {return createBean(beanName, mbd, args);}catch (BeansException ex) {// Explicitly remove instance from singleton cache: It might have been put there// eagerly by the creation process, to allow for circular reference resolution.// Also remove any beans that received a temporary reference to the bean.destroySingleton(beanName);throw ex;}});bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}}/*** Return the (raw) singleton object registered under the given name,* creating and registering a new one if none registered yet.* @param singletonFactory the ObjectFactory to lazily create the singleton with, if necessary 这里的singletonFactory就是上面的那个lambda方法* @return the registered singleton object*/public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {singletonObject = singletonFactory.getObject();//lambda调用createBean}/*** Implementation of relevant AbstractBeanFactory template methods!* Central method of this class:* 1.creates a bean instance,* 2.populates the bean instance* 3.applies post-processors, etc.* @see #doCreateBean*/@Overrideprotected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {Object beanInstance = doCreateBean(beanName, mbdToUse, args);}/*** Actually create the specified bean. Pre-creation processing has already happened at this point, e.g. checking {@code postProcessBeforeInstantiation} callbacks.* <p>Differentiates between default bean instantiation, use of a factory method, and autowiring a constructor.* @param mbd the merged bean definition for the bean*/protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {// Instantiate the bean.// Initialize the bean instance.Object exposedObject = bean;try {populateBean(beanName, mbd, instanceWrapper);exposedObject = initializeBean(beanName, exposedObject, mbd);}// Register bean as disposable.}/**后置处理器前处理执行初始化方法后置处理器后处理*/protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {invokeAwareMethods(beanName, bean);if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}invokeInitMethods(beanName, wrappedBean, mbd);if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean;}/*** Give a bean a chance to react now all its properties are set,* and a chance to know about its owning bean factory (this object).* This means checking whether the bean implements InitializingBean or defines* a custom init method, and invoking the necessary callback(s) if it does.* @param beanName the bean name in the factory (for debugging purposes)* @param bean the new bean instance we may need to initialize* @param mbd the merged bean definition that the bean was created with* (can also be {@code null}, if given an existing bean instance)* @throws Throwable if thrown by init methods or by the invocation process* @see #invokeCustomInitMethod*/protected void invokeInitMethods(String beanName, Object bean, @Nullable RootBeanDefinition mbd) throws Throwable {//先执行 InitializingBean实现类逻辑afterPropertiesSet方法调用((InitializingBean) bean).afterPropertiesSet();//在执行 手动指定@Bean(initMethod="init", destroyMethod="destroy")逻辑invokeCustomInitMethod(beanName, bean, mbd);//反射调用}//后置处理器的[前处理]相关逻辑@Overridepublic Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor processor : getBeanPostProcessors()) {Object current = processor.postProcessBeforeInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;}//后置处理器的[后处理]相关逻辑@Overridepublic Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor processor : getBeanPostProcessors()) {Object current = processor.postProcessAfterInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;}}
看看spring默认的beanPostProcessors
这些后置处理器在DefaultListableBeanFactory中 作为一个属性,肯定就有一个顺序的问题
如果我们用了JSR-250的注解
那么CommonAnnotationBeanPostProcessor这个就会帮我们在某个时机(周期)执行对应的方法,底层也是反射调用方法

第三个
解析
全流程图
分析部分代码
public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)throws BeansException {// ①处理别名BeanName、②处理带&符的工厂BeanNameString beanName = transformedBeanName(name);Object bean;// Eagerly check singleton cache for manually registered singletons.// 先尝试从缓存中获取Bean实例,这个位置就是三级缓存解决循环依赖的方法Object sharedInstance = getSingleton(beanName);if (sharedInstance != null && args == null) {if (logger.isTraceEnabled()) {if (isSingletonCurrentlyInCreation(beanName)) {logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +"' that is not fully initialized yet - a consequence of a circular reference");}else {logger.trace("Returning cached instance of singleton bean '" + beanName + "'");}}// 1. 如果 sharedInstance 是普通的 Bean 实例,则下面的方法会直接返回// 2. 如果 sharedInstance 是工厂Bean类型,则需要获取 getObject 方法,可以参考关于 FactoryBean 的实现类 工厂的会走这里bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);}else {// Fail if we're already creating this bean instance:// We're assumably within a circular reference.if (isPrototypeCurrentlyInCreation(beanName)) {throw new BeanCurrentlyInCreationException(beanName);}// Check if bean definition exists in this factory.BeanFactory parentBeanFactory = getParentBeanFactory();//父工厂存在并且当前 bean 不存在于当前bean工厂 则到父工厂查找 bean 实例if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {// Not found -> check parent.String nameToLookup = originalBeanName(name);if (parentBeanFactory instanceof AbstractBeanFactory) {return ((AbstractBeanFactory) parentBeanFactory).doGetBean(nameToLookup, requiredType, args, typeCheckOnly);}else if (args != null) {// Delegation to parent with explicit args.return (T) parentBeanFactory.getBean(nameToLookup, args);}else if (requiredType != null) {// No args -> delegate to standard getBean method.return parentBeanFactory.getBean(nameToLookup, requiredType);}else {return (T) parentBeanFactory.getBean(nameToLookup);}}if (!typeCheckOnly) {markBeanAsCreated(beanName);}try {// 从容器 getMergedLocalBeanDefinition 获取 beanName 对应的 GenericBeanDefinition,转换为 RootBeanDefinitionRootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);checkMergedBeanDefinition(mbd, beanName, args);// Guarantee initialization of beans that the current bean depends on.// 处理使用了 depends-on 注解的依赖创建 bean 实例String[] dependsOn = mbd.getDependsOn();if (dependsOn != null) {for (String dep : dependsOn) {// 监测是否存在 depends-on 循环依赖,若存在则会抛出异常 注解的话会处理@DependsOn("adidas") xml的话会处理<bean id="userService" class="com.lcd.demo.service.UserService" depends-on="userDao"/>if (isDependent(beanName, dep)) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");}// 注册依赖记录registerDependentBean(dep, beanName);try {// 加载 depends-on 依赖(dep 是 depends-on 缩写)getBean(dep);}catch (NoSuchBeanDefinitionException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"'" + beanName + "' depends on missing bean '" + dep + "'", ex);}}}// 创建单例 bean 实例// Create bean instance.if (mbd.isSingleton()) {//真正逻辑sharedInstance = getSingleton(beanName, () -> {try {//创建Beanreturn createBean(beanName, mbd, args);}catch (BeansException ex) {// Explicitly remove instance from singleton cache: It might have been put there// eagerly by the creation process, to allow for circular reference resolution.// Also remove any beans that received a temporary reference to the bean.destroySingleton(beanName);throw ex;}});bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}// 创建多例 bean 实例else if (mbd.isPrototype()) {// It's a prototype -> create a new instance.Object prototypeInstance = null;try {beforePrototypeCreation(beanName);prototypeInstance = createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);}else {String scopeName = mbd.getScope();if (!StringUtils.hasLength(scopeName)) {throw new IllegalStateException("No scope name defined for bean ´" + beanName + "'");}Scope scope = this.scopes.get(scopeName);if (scope == null) {throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");}try {Object scopedInstance = scope.get(beanName, () -> {beforePrototypeCreation(beanName);try {return createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}});bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);}catch (IllegalStateException ex) {throw new BeanCreationException(beanName,"Scope '" + scopeName + "' is not active for the current thread; consider " +"defining a scoped proxy for this bean if you intend to refer to it from a singleton",ex);}}}catch (BeansException ex) {cleanupAfterBeanCreationFailure(beanName);throw ex;}}// 如果需要类型转换,这里会进行操作// Check if required type matches the type of the actual bean instance.if (requiredType != null && !requiredType.isInstance(bean)) {try {T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);if (convertedBean == null) {throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}return convertedBean;}catch (TypeMismatchException ex) {if (logger.isTraceEnabled()) {logger.trace("Failed to convert bean '" + name + "' to required type '" +ClassUtils.getQualifiedName(requiredType) + "'", ex);}throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}}return (T) bean;}}

