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, exposedObject,mbd)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)