1 FactoryBean和BeanFactory区别
在 Spring 中,有两个接口:BeanFactory
和 FactoryBean
因为名字相近很容易被混淆。那他们之间有什么区别呢
1.1 BeanFactory
1.1.1 定义
BeanFactory
,以Factory
结尾,表示它是一个工厂类(接口), 它负责生产和管理bean
的一个工厂
BeanFactory
定义了IOC
容器的最基本形式,并提供了IOC
容器应遵守的的最基本
的接口,也就是Spring IOC
所遵守的最底层
和最基本
的编程规范。
在Spring
中,BeanFactory
是IOC
容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖
在Spring
代码中,BeanFactory
只是个接口,并不是IOC
容器的具体实现,但是Spring容器给出了很多种实现,比如:
- DefaultListableBeanFactory。
- XmlBeanFactory
- ApplicationContext
这些实现类从不同的维度对 beanFactory
进行了扩展。
1.1.2 beanFactory 源码
package org.springframework.beans.factory;
import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;public interface BeanFactory {factoryBean 的转义标识符。(具体用法后面有介绍)String FACTORY_BEAN_PREFIX = "&";根据 name 从容器中拿对应的 beanObject getBean(String name) throws BeansException;根据 name 和 type 从容器中拿对应的 bean,要对 bean 的类型做校验。<T> T getBean(String name, Class<T> requiredType) throws BeansException;在容器中能否找到与 name 匹配的 bean 或者 beanDefinition。boolean containsBean(String name);判断 name 对对应的 bean 是不是 单例。boolean isSingleton(String name) throws NoSuchBeanDefinitionException;boolean isPrototype(String name) throws NoSuchBeanDefinitionException;判断 name 对应的 bean 与指定的类型是否匹配。boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;根据 name 获取对应的 bean 的类型。@NullableClass<?> getType(String name) throws NoSuchBeanDefinitionException;根据 name 获取对应 bean 的 别名。String[] getAliases(String name);
}
1.1.3 BeanFactory体系结构
BeanFactory
的类体系结构
-
BeanFactory
: 接口位于类结构树的顶端, 它最主要的方法就是getBean(StringbeanName)
,该方法从容器中返回特定名称的Bean
,BeanFactory
的功能通过其他的接口得到不断扩展。 -
ListableBeanFactory
:该接口定义了访问容器中Bean
基本信息的若干方法,如查看Bean 的个数、获取某一类型Bean 的配置名、查看容器中是否包括某一Bean 等方法; -
HierarchicalBeanFactory
:父子级联IoC 容器的接口,子容器可以通过接口方法访问父容器; -
ConfigurableBeanFactory
:是一个重要的接口,增强了IoC 容器的可定制性,它定义了设置类装载器、属性编辑器、容器初始化后置处理器等方法; -
AutowireCapableBeanFactory
:定义了将容器中的Bean 按某种规则(如按名字匹配、按类型匹配等)进行自动装配的方法; -
SingletonBeanRegistry
:定义了允许在运行期间向容器注册单实例Bean 的方法; -
BeanDefinitionRegistry
:Spring
配置文件中每一个<bean>
节点元素在Spring 容器里都通过一个BeanDefinition
对象表示,它描述了Bean
的配置信息。而BeanDefinitionRegistry
接口提供了向容器手工注册BeanDefinition 对象的方法
1.1.4 使用场景
使用场景:
- 通过 名字或类型从容器中获取 bean。
- 判断容器中是否包含指定的 bean。
- 判断 bean 是不是单例。
1.2 FactoryBean
一般情况下,Spring
通过反射机制利用<bean>
的class
属性指定实现类实例化Bean
,但在某些情况下,实例化Bean
过程比较复杂,如果按照传统的方式,则需要在<bean>
中提供大量的配置信息。配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。Spring
为此提供了一个org.springframework.bean.factory.FactoryBean
的工厂类接口,用户可以通过实现该接口定制实例化Bean
的逻辑。
首先 FactoryBean
是一个 bean
,但它又不仅仅是个 bean
。它是一个可以 创建
或 修饰
其他对象的工厂 bean
,这跟设计模式中的工厂模式
或者装饰模式
很相似,它可以创建除自身以外的其他对象