1 FactoryBean和BeanFactory区别

在 Spring 中,有两个接口:BeanFactoryFactoryBean 因为名字相近很容易被混淆。那他们之间有什么区别呢

1.1 BeanFactory

1.1.1 定义

BeanFactory,以Factory结尾,表示它是一个工厂类(接口), 它负责生产和管理bean的一个工厂
BeanFactory定义了IOC容器的最基本形式,并提供了IOC容器应遵守的的最基本的接口,也就是Spring IOC所遵守的最底层最基本的编程规范。
Spring中,BeanFactoryIOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖

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),该方法从容器中返回特定名称的BeanBeanFactory 的功能通过其他的接口得到不断扩展。
  • ListableBeanFactory:该接口定义了访问容器中Bean 基本信息的若干方法,如查看Bean 的个数、获取某一类型Bean 的配置名、查看容器中是否包括某一Bean 等方法;
  • HierarchicalBeanFactory:父子级联IoC 容器的接口,子容器可以通过接口方法访问父容器;
  • ConfigurableBeanFactory:是一个重要的接口,增强了IoC 容器的可定制性,它定义了设置类装载器、属性编辑器、容器初始化后置处理器等方法;
  • AutowireCapableBeanFactory:定义了将容器中的Bean 按某种规则(如按名字匹配、按类型匹配等)进行自动装配的方法;
  • SingletonBeanRegistry:定义了允许在运行期间向容器注册单实例Bean 的方法;
  • BeanDefinitionRegistrySpring 配置文件中每一个<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,这跟设计模式中的工厂模式或者装饰模式很相似,它可以创建除自身以外的其他对象