Spring源码分析之Bean的创建过程详解 (2)

getObjectFromFactoryBean的代码摘取片段

protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName, boolean shouldPostProcess){ // 获取bean,调用factoryBean的getObject() object = doGetObjectFromFactoryBean(factory, beanName); } private Object doGetObjectFromFactoryBean(FactoryBean<?> factory, String beanName){ object = factory.getObject(); }

以上为从缓存中获取到bean,处理FactoryBean的逻辑,接下来我们看看实际创建bean的过程

以下为续接上面doGetBean中未从缓存中获取到bean的逻辑

// 如果有被@DependsOn标记,先创建DependsOn的bean String[] dependsOn = mbd.getDependsOn(); if (dependsOn != null) { for (String dep : dependsOn) { registerDependentBean(dep, beanName); getBean(dep); } } // 单例bean if (mbd.isSingleton()) { // 开始创建bean sharedInstance = getSingleton(beanName, () -> { // 真正创建bean return createBean(beanName, mbd, args); }); // 如果是工厂类且name不以&开头,则调用工厂类的getObject() // 其他情况返回原对象 bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); } getSingleton,此方法为重载方法,与从缓存中获取bean并非同一个 public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) { Assert.notNull(beanName, "Bean name must not be null"); // 开始创建bean时加锁,注意这个锁的同步对象与从缓存中获取时锁的同步对象相同 synchronized (this.singletonObjects) { // 再次从缓存中获取,有直接返回,出现有的情况 // 1.线程一正在创建A实例,线程二尝试获取,被同步锁阻塞 // 2.线程一创建完毕,线程二进入同步代码块,从缓存中获取直接返回 Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null) { // 标记正在创建中 beforeSingletonCreation(beanName); boolean newSingleton = false; try { // 调用回调函数获取到bean singletonObject = singletonFactory.getObject(); newSingleton = true; } finally { // 清理状态 afterSingletonCreation(beanName); } if (newSingleton) { // 将创建的bean添加到单例缓存池中,并移除二三级缓存 addSingleton(beanName, singletonObject); } } return singletonObject; } } createBean,终于开始创建bean了~ protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args){ // 第一次调用bean后置处理器,在bean实例化之前的进行处理 // Spring内置的后置处理器中,无相关实现 // 可使用自定义的后置处理器在这里进行中止bean的创建过程操作 Object bean = resolveBeforeInstantiation(beanName, mbdToUse); if (bean != null) { // 如果自定义的后置处理器返回了bean,则直接return,bean的创建过程于此中断 return bean; } // 进行创建bean Object beanInstance = doCreateBean(beanName, mbdToUse, args); } protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args){ // 实例化bean 第二次调用bean后置处理器,用于获取bean的有参构造器 instanceWrapper = createBeanInstance(beanName, mbd, args); // 第三次 处理beanDefinition的元数据信息 applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); // 是否允许暴露早期对象 boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName)); // 第四次 用于获取早期对象时的处理 // 将获取早期对象的回调方法放到三级缓存中 addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean)); // 第五、六次,填充属性 可使用的方式 byName byType @Resource @Value @Autowired @Inject populateBean(beanName, mbd, instanceWrapper); // 第七、八次,初始化 exposedObject = initializeBean(beanName, exposedObject, mbd); // 第九次 判断bean是否有销毁方法,有则将bean注册到销毁集合中,用于容器关闭时使用 registerDisposableBeanIfNecessary(beanName, bean, mbd); // 返回创建好的bean return exposedObject; }

你以为这就结束了?

接下来我们就来看看这里后置处理器到底做了什么吧

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgxxy.html