BeanFactory是Spring中非常重要的一个类,搞懂了它,你就知道了bean的初始化和摧毁过程,对于深入理解IOC有很大的帮助。
BeanFactory体系结构首先看一下使用IDEA生成的继承层次图(图中去掉了ApplicationContext的继承图):
可以看到BeanFactory下的接口主要分为三个:
HierarchicalBeanFactory:详细的分析见https://www.cnblogs.com/zhangfengxian/p/11086695.html#hierarchicalbeanfactory
ListableBeanFactory:详细的分析见https://www.cnblogs.com/zhangfengxian/p/11086695.html#listablebeanfactory
AutowireCapableBeanFactory:能够自动装配的bean的工厂需要实现此接口,下面会进行详细的说明。
关于BeanFactory的分析见https://www.cnblogs.com/zhangfengxian/p/11086695.html#beanfactory
BeanFactory接口分析下面将对BeanFactory中的接口进行分析。
AutowireCapableBeanFactory该接口提供了对现有bean进行自动装配的能力,设计目的不是为了用于一般的应用代码中,对于一般的应用代码应该使用BeanFactory和ListableBeanFactory。其他框架的代码集成可以利用这个接口去装配和填充现有的bean的实例,但是Spring不会控制这些现有bean的生命周期。你也许注意到了ApplicationContext中的getAutowireCapableBeanFactory()能获取到AutowireCapableBeanFactory的实例(https://www.cnblogs.com/zhangfengxian/p/11086695.html#applicationcontext%E8%AE%BE%E8%AE%A1%E8%A7%A3%E6%9E%90)。同样,也能实现BeanFactoryAware接口来接收BeanFactory(应用程序上下暴露的内部使用的BeanFactory)的实例,然后将其转换成AutowireCapableBeanFactory。
下面看一下这个接口中的静态成员变量和方法:
// 定义了bean的装配策略 int AUTOWIRE_NO = 0; // 不进行装配 int AUTOWIRE_BY_NAME = 1; // 根据名字进行装配 int AUTOWIRE_BY_TYPE = 2; // 根据类型进行装配 int AUTOWIRE_CONSTRUCTOR = 3; // 根据构造函数进行装配 @Deprecated int AUTOWIRE_AUTODETECT = 4; // Spring3.0已经过时的方法,通过省视bean来决定适当的装载策略 //Spring5.1后增加,原始实例的后缀,例如"com.mypackage.MyClass.ORIGINAL",强制返回给定的实例(没有代理) String ORIGINAL_INSTANCE_SUFFIX = ".ORIGINAL"; // 完全创建给定类的一个新的实例,包括所有适用的BeanPostProcessor // 填充注解的field和方法,并且会应用所有的初始化回调函数 <T> T createBean(Class<T> beanClass) throws BeansException; // 装配bean,通过应用初始化之后的回调函数和bean属性的后置处理来填充给定的bean的实例 // 本质上是为了在创建新的实例或者反序列化实例时,填充(重新填充)实例中注解的field和方法 void autowireBean(Object existingBean) throws BeansException; // 配置给定的原始bean:自动装配bean的属性,应用bean的属性值、工厂回调函数(例如setBeanName,values) // 同样也会应用所有bean的后置处理器 Object configureBean(Object existingBean, String beanName) throws BeansException; // 使用指定的装配策略来完全创建一个新的bean的实例 Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; // 使用指定的装配策略来实例化一个给定类新的bean的实例 // 不会应用标准的BeanPostProcessor回调函数或者在未来执行任何bean的初始化 Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; // 根据名字和类型来自动装配给定bean的实例的属性 // 不会应用标准的BeanPostProcessor回调函数或者在未来执行任何bean的初始化 void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck) throws BeansException; // 应用给定名字的bean的定义的属性值到给定的bean的实例 // 该方法不会自动装配bean属性,仅仅应用明确定义的属性值 void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException; // 初始化给定的原始的bean应用bean的属性值、工厂回调函数(例如setBeanName,values) // 同样也会应用所有bean的后置处理器 Object initializeBean(Object existingBean, String beanName) throws BeansException; // 应用BeanPostProcessor到给定的现存的bean的实例,调用postProcessBeforeInitialization方法 Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException; // 应用BeanPostProcessor到给定的现存的bean的实例,postProcessAfterInitialization Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException; // 摧毁给定的bean的实例,应用DisposableBean规约和注册的DestructionAwareBeanPostProcessor void destroyBean(Object existingBean); // 解析唯一匹配给定对象类型的bean的实例,该方法是getBean(Class)的变种,只不过它还提供了匹配实例的bean的名字 <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException; // 解析给定bean的名字的实例,提供了用于暴露目标的工厂方法的依赖描述符 Object resolveBeanByName(String name, DependencyDescriptor descriptor) throws BeansException; // 针对在工厂中定义的bean来解析指定的依赖 Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException; // 针对在工厂中定义的bean来解析指定的依赖 Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName, @Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException; ConfigurableBeanFactory