//真正的创建bean<br> Object beanInstance = doCreateBean(beanName, mbdToUse, args);<br>
进入到这个方法,那就相当于要真实的中规中矩的创建 bean 对象了!这个方法中共有三个大步骤:<br><br>1、实例化 bean 对象(此时 bean 中所有属性均为空)<br>2、属性赋值 & 依赖注入<br>3、bean 对象的初始化(执行完该步骤后 bean 已经完整)<br>
//处理FactoryBean的小细节问题
//factoryBeanInstanceCache的作用:获取到FactoryBean中生成的bean的类型。
//【真正的bean对象创建】<br> instanceWrapper = createBeanInstance(beanName, mbd, args);<br>
//解析出bean的类型<br> Class<?> beanClass = resolveBeanClass(mbd, beanName);<br>
//bean无法被访问,则抛出异常
//【工厂方法创建】
//这一步是为原型bean的一个小优化(由于原型bean的创建过程中,每次的执行流程都是一样的,所以执行一次后,把这个过程中<br> // 一些需要的东西缓存起来,以备后续再创建该bean是可以直接拿这些信息,去创建bean对象)<br>
//当满足任一条件,就会执行基于构造器的实例化<br> //1、通过SmartInstantiationAwareBeanPostProcessor找到了构造器<br> //2、配置了注入方式是AUTOWIRE_CONSTRUCTOR<br> //3、定义bean的时候指定了constructor-arg<br> //4、构造bean时传入了args参数<br> Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);<br> if (ctors != null ||<br> mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||<br> mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {<br> return autowireConstructor(beanName, mbd, ctors, args);<br> }<br>
//使用默认的无参构造器反射创建bean对象<br> return instantiateBean(beanName, mbd);<br>
//得到真实的bean对象引用
//回调MergedBeanDefinitionPostProcessor(处理相关注解)<div>applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);<br></div>
InitDestroyAnnotationBeanPostProcessor实现类
//处理初始化和销毁注解的后置处理器<br> @Override<br> public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {<br> //查找bean的生命周期元信息<br> LifecycleMetadata metadata = findLifecycleMetadata(beanType);<br> metadata.checkConfigMembers(beanDefinition);<br> }<br>
<div>//用到缓存机制,把bean的初始化和销毁注解信息都保存到lifecycleMetadataCache里<br></div>return buildLifecycleMetadata(clazz);
//反射所有的public方法
//寻找所有被初始化注解(@PostConstruct)标注的方法
//寻找所有被销毁注解(@PreDestroy)标注的方法
CommonAnnotationBeanPostProcessor实现类
//调用InitDestroyAnnotationBeanPostProcessor<br> super.postProcessMergedBeanDefinition(beanDefinition, beanType, beanName);<br>
//收集注入相关的信息<br> InjectionMetadata metadata = findResourceMetadata(beanName, beanType, null);<br>
<div>//额外收集了@Resource注解的信息<br></div>metadata = buildResourceMetadata(clazz);
AutowiredAnnotationBeanPostProcessor实现类
//已经指定好默认支持@Autowire注解、@Value注解、如果 classpath 下有来自 JSR 330 的 @Inject 注解,也会一并支持
//早期bean对象引用的获取与缓存(bean被实例化出来以后还没有进行属性赋值和组件的依赖注入,但此时的bean对象已经实实在在的存在了<br> // 。如果在此期间,有另外的bean又需要创建它时,就不应该再创建同样的一个bean对象,而是直接拿到该引用)<br>
//属性赋值+依赖注入<br> populateBean(beanName, mbd, instanceWrapper);<br>
//检查BeanWrapper是否存在
//回调InstantiationAwareBeanPostProcessors(postProcessAfterInstantiation方法也是干预bean的属性等东西。<br> // 而且postProcessAfterInstantiation方法返回的boolean类型,当postProcessAfterInstantiation返回false时,<br> // 会直接return出去,不再执行下面的属性赋值+组件依赖注入的逻辑。<br> // 这个回调的位置,就是让咱在bean已经初始化好,但还没有开始属性赋值和依赖注入时切入自定义逻辑)<br>
//解析出当前bean支持的自动注入模式
//它将这个过程中需要组件依赖注入的信息也封装进了PropertyValues中了,所以此时pvs就应该有一开始封装的信息,<br> //以及通过自动注入封装好的依赖信息<br> pvs = newPvs;<br>
//又回调InstantiationAwareBeanPostProcessor<div>//【核心】回调postProcessProperties(传入pvs返回pvs,这个过程相当于反复给pvs封装数据)<br> pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);<br></div>
AutowiredAnnotationBeanPostProcessor实现类
//收集注解信息<br> InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);<br>
//真正的给bean对象属性赋值(注意点:在BeanFactoryPostProcessor或者BeanDefinitionRegistryPostProcessor<br> // 中无法使用@Autowire直接注入spring中的内部组件(如Environment),因为当BeanDefinitionRegistryPostProcessor<br> // 在初始化阶段,还不存在BeanPostProcessor呢,所以那些用于支持依赖注入的后置处理器(AutowiredAnnotationBeanPostProcessor)<br> // 还没有被初始化,自然也就没办法支持注入了。正确的做法是借助Aware接口的回调注入)<br> metadata.inject(bean, beanName, pvs);<br>
//收集所有需要注入的信息<br> Collection<InjectedElement> elementsToIterate =<br> (checkedElements != null ? checkedElements : this.injectedElements);<br>
//迭代,依次注入<div>element.inject(target, beanName, pvs);<br></div>
//反射注入字段<br> Field field = (Field) this.member;<br> ReflectionUtils.makeAccessible(field);<br> field.set(target, getResourceToInject(target, requestingBeanName));<br>
//反射调用setter方法<br> Method method = (Method) this.member;<br> ReflectionUtils.makeAccessible(method);<br> method.invoke(target, getResourceToInject(target, requestingBeanName));<br>
//将PropertyValues应用给bean<br> applyPropertyValues(beanName, mbd, bw, pvs);<br>
//预检查和准备
//重复解析的提前返回
//BeanDefinitionValueResolver的初始化需要传入一个TypeConverter,而这个TypeConverter是spring中内部用于<br> //类型转换的核心api。简单来说,使用TypeConverter可以将一个`String类型的数据,转换为特定的所需要的类型的数据。<br> //而BeanDefinitionValueResolver就利用TypeConverter,完成对bean实例中需要注入的属性值进行解析,并适配<br> //为bean所需要的类型(如String->int,依赖的bean的名称转为实际bean的引用)<br> BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, converter);<br>
//类型转换(不是重点)
//把pvs中的属性值全部应用到bean对象中。<br> bw.setPropertyValues(new MutablePropertyValues(deepCopy));<br>
//此时bean中的属性都是齐全的了<br> exposedObject = initializeBean(beanName, exposedObject, mbd);<br>
//执行aware回调<br> invokeAwareMethods(beanName, bean);<br>
//如果bean实现了BeanNameAware,则强转后调用setBeanName方法注入bean的名称
//如果bean实现了BeanClassLoaderAware,则强转后调用setBeanClassLoader方法注入当前的classLoader
//如果bean实现了BeanFactoryAware,则强转后调用setBeanFactory方法注入BeanFactory
//执行BeanPostProcessor的前置回调<br> wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);<br>
InitDestroyAnnotationBeanPostProcessor实现类
//findLifecycleMetadata方法把标注了@PostConstruct 和 @PreDestroy的方法都提取出来,所以这里就相当于回调@PostConstruct<br> //标注的方法<br> LifecycleMetadata metadata = findLifecycleMetadata(bean.getClass());<br> try {<br> metadata.invokeInitMethods(bean, beanName);<br> }<br>
ApplicationContextAwareProcessor实现类
由此我们可以先得出一个结论:BeanFactory 的注入时机比 ApplicationContext 早。
//执行生命周期回调<br> invokeInitMethods(beanName, wrappedBean, mbd);<br>
//回调InitializingBean的afterPropertiesSet方法<br> ((InitializingBean) bean).afterPropertiesSet();<br>
//回调init-method方法(同样是反射调用)<br> invokeCustomInitMethod(beanName, bean, mbd);<br>
//执行BeanPostProcessor的后置回调<br> wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);<br>
AbstractAutoProxyCreator实现类
//创建代理对象<br> return wrapIfNecessary(bean, beanName, cacheKey);<br>
ApplicationListenerDetector实现类
这个 ApplicationListenerDetector它用来关联所有的监听器引用。同样的,监听器在创建的时候,也需要 ApplicationListenerDetector 把这些监听器挂进 ApplicationContext 中,这样这些监听器才可以被事件广播器使用。
//注册销毁时的回调(如果一个bean定义的class有实现DisposableBean接口,或者声明了@@PreDestroy注解,或者声明了<br> // destroy-method方法,则会在doCreateBean的方法最后一步,注册一个销毁bean的回调钩子)<br> try {<br> registerDisposableBeanIfNecessary(beanName, bean, mbd);<br> }<br>
//不是原型bean,且有定义销毁类型的方法
//处理特殊的scope