AbstractAutowireCapableBeanFactory # createBean(),整体方法如下:
/**
* Central method of this class: creates a bean instance,
* populates the bean instance, applies post-processors, etc.
* @see #doCreateBean
*/
@Override
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
throws BeanCreationException {
if (logger.isDebugEnabled()) {
logger.debug("Creating instance of bean '" + beanName + "'");
}
RootBeanDefinition mbdToUse = mbd;
// Make sure bean class is actually resolved at this point, and
// clone the bean definition in case of a dynamically resolved Class
// which cannot be stored in the shared merged bean definition.
// 1.解析beanName对应的Bean的类型
Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
mbdToUse = new RootBeanDefinition(mbd);
mbdToUse.setBeanClass(resolvedClass);
}
// Prepare method overrides.
try {
// 2.验证及准备覆盖的方法(对override属性进行标记及验证)
mbdToUse.prepareMethodOverrides();
}
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
beanName, "Validation of method overrides failed", ex);
}
try {
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
// 3.实例化前的处理,给InstantiationAwareBeanPostProcessor一个机会返回代理对象来替代真正的bean实例,达到“短路”效果
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
// 4.如果bean不为空,则会跳过Spring默认的实例化过程,直接使用返回的bean
if (bean != null) {
return bean;
}
}
catch (Throwable ex) {
throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
"BeanPostProcessor before instantiation of bean failed", ex);
}
try {
// ========================================================================================================!!
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
if (logger.isDebugEnabled()) {
logger.debug("Finished creating instance of bean '" + beanName + "'");
}
return beanInstance;
}
catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
// A previously detected exception with proper bean creation context already,
// or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry.
throw ex;
}
catch (Throwable ex) {
throw new BeanCreationException(
mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
}
}
执行到图上这行代码时,会执行所有的InstantiationAwareBeanPostProcessor类型的后置处理器,从这行代码跟进去
先执行Before方法,如果bean不为null再执行After方法,然后根据bean的状态设置mbd的beforeInstantiationResolved状态,下面看一下Before方法
拿出所有的后置处理器拿出InstantiationAwareBeanPostProcessor类型的,分别执行处理器中的方法
postProcessBeforeInstantiation(),返回执行结果
在执行完之后,返回的是null,下面测试一下自己的代码
@Component
public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
if (beanName.equals("userService")){
System.out.println("自定义处理器的:postProcessBeforeInstantiation执行了");
return new MyBean();
}
return beanClass;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (beanName.equals("userService")){
System.out.println("自定义处理器的:postProcessBeforeInstantiation执行了");
}
return bean;
}
}
控制台输出:
回到AbstractAutowireCapableBeanFactory # createBean()
AbstractAutowireCapableBeanFactory # doCreateBean
AbstractAutowireCapableBeanFactory # createBeanInstance
进入上图中最后一行代码中的方法:
AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors
在这个方法中,循环所有的后置处理器,拿出SmartInstantiationAwareBeanPostProcessor类型的后置处理器,执行determineCandidateConstructors 方法,此时所有后置处理器中实现了该接口的有
其中只有AutowiredAnnotationBeanPostProcessor 的determineCandidateConstructors 方法有意义(该方法在后面的章节中单独解释),其他两个都直接返回null
上图中if判断条件均返回false,进入到instantiateBean(beanName, mbd)
AbstractAutowireCapableBeanFactory # instantiateBean
SimpleInstantiationStrategy # instantiate
BeanUtils # instantiateClass
回到 AbstractAutowireCapableBeanFactory # instantiateBean,此时UserService对象已经被创建出来了,用一个包装类,包装之后返回
回到AbstractAutowireCapableBeanFactory # doCreateBean