Spring源码之AbstractAutowireCapableBeanFactory

本文深入探讨Spring框架中AbstractAutowireCapableBeanFactory的作用,涉及bean的实例化、属性装配、初始化及生命周期管理。内容涵盖创建非预定义bean、原型bean的控制以及对AbstractBeanFactory模板方法的实现。此外,还介绍了自动装配、bean初始化过程以及对BeanPostProcessor、InitializingBean接口的调用等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                                                                                AbstractAutowireCapableBeanFactory

整体这个类做的事情有:提供bean创建功能(通过构造器)、属性渲染,装配(包括自动装配)、初始化。处理运行时的bean引用,解析已经管理的结果、调用初始化方法。并且提供了自动装配的功能。

 子类需要实现的方法主要是resolveDependency(DependencyDescriptor, String, Set, TypeConverter), 此方法用于实现按类型匹配的自动装配,依赖解析成bean。此类没有实现bean definition 注册功能,需要子类来完成。

此类的构造方法会导致BeanNameAware、BeanFactoryAware、BeanClassLoaderAware类型的依赖无法被解析(调用方法this.ignoredDependencyInterfaces.add(typeToIgnore);

   private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();

CglibSubclassingInstantiationStrategy是默认bean创建策略,CglibSubclassingInstantiationStrategy需要一个cglib包,如果没有也可以正常运行,因为,只有当方法注入需要生成子类时,才需要cglib。

   private ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();默认的参数名字解析策略,asm字节码技术。


方法作用大概分为几类:   

  • 1.实例化非预定义的bean(或者渲染存在的bean)
  • 2.bean生命周期的精细控制。
  • 3.父类AbstractBeanFactory模版方法的实现。
  • 4.其他方法会调用的一些支持方法,大部分通过protected暴露给子类了,(留下扩展空间)

1.实例化非预定义的bean(或者渲染存在的bean)--这类bean都是prototype

createBean(Class<T> beanClass) 具体创建过程参考doCreateBean(beanName, mbd, args)。这里面功能比较完成,除了实例化,还包括其他的spring定义的bean初始化生命周期

autowireBean(Object existingBean) 自动装配实例bean,具体过程参考populateBean(bd.getBeanClass().getName(), bd, bw);

configureBean(Object existingBean, String beanName)自动配置,与上个方法相比,多了自动调用initializeBean(beanName, exposedObjectmbd)BeanPostProcessor,InitializingBean,xxxAware的过程。

上面这些方法从整体来看,实际上都是获取到class信息,然后创建一个对应的RootBeanDefinition,BeanWrapper逐步调用populateBean(beanName, mbd, instanceWrapper)和initializeBean(beanName, exposedObject, mbd)

2.bean生命周期的精细控制--这里创建的实例也为prototype

createBean(Class beanClass, int autowireMode, boolean dependencyCheck)

autowire(Class beanClass, int autowireMode, boolean dependencyCheck)

autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)

applyBeanPropertyValues(Object existingBean, String beanName)

initializeBean(Object existingBean, String beanName)

applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)

applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)

从方法来看普通bean在初始化时,包含创建、自动装配、属性设置、应用b eanPostProcessor接口,initializeBean和后面两个方法功能上有点重复,因为最initializeBean的调用会导致BeanPostProcessor接口的两个方法被调用。这里没有太多的功能,主要都是调用别人的方法,具体实现细节都在最后一部分。

3.父类AbstractBeanFactory模版方法的实现。

a.createBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)

创建bean在[实例化非预定义的bean]时调用过。InstantiationAwareBeanPostProcessor这个接口是有机会返回实例,如果返回了实例,那么不在调用后面的doCreateBean,据说是为了

b.postProcessBeforeInstantiation(Class<?> beanClass, String beanName) 能够返回代理类。

c.doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)看到do前缀就懂了,肯定是给上个方法打工的

d.predictBeanType(String beanName, RootBeanDefinition mbd, Class... typesToMatch

e.getTypeForFactoryMethod(String beanName, RootBeanDefinition mbd, Class[] typesToMatch)

f.getTypeForFactoryBean(String beanName, RootBeanDefinition mbd)

g.getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值