文章目录
- 前言
- 一、BeanFactory
- 二、FactoryBean
前言
面试中被问到过Spring BeanFactory FactoryBean的区别?当时没答上来,感觉这就是一个文字游戏,后面仔细的了解了一下,分享给大家。
一、BeanFactory
在 Spring 中最核心的就是 Ioc 容器,它保存了所有需要对外提供的 Bean 的实例。Spring 对外暴露的 ApplicationContext作为 IoC 容器最重要的接口,它也实现了 BeanFactory 接口。
所以,BeanFactory 从名字上来看,它是一个 Factory,相当于是 IoC 容器的顶级接口,是 IoC 容器最基础的实现。也是提供访问 Spring 容器的跟接口,主要负责 Bean 的创建和
访问。其中,最主要的一个方法就是 getBean()。同时,在BeanFactory 中还会完成对 Bean 的依赖注入,也就是 DI。
public interface BeanFactory {
//对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,
//如果需要得到工厂本身,需要转义
String FACTORY_BEAN_PREFIX = "&";
//根据bean的名字,获取在IOC容器中得到bean实例
Object getBean(String name) throws BeansException;
//根据bean的名字和Class类型来得到bean实例,增加了类型安全验证机制。
<T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
//提供对bean的检索,看看是否在IOC容器有这个名字的bean
boolean containsBean(String name);
//根据bean名字得到bean实例,并同时判断这个bean是不是单例
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
//得到bean实例的Class类型
@Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
//得到bean的别名,如果根据别名检索,那么其原名也会被检索出来
String[] getAliases(String name);
}
二、FactoryBean
那 FactoryBean 呢? 从名字上来看它是一个特殊的 Bean,这个 Bean 可以返回创建 Bean 的工厂。如果 FactoryBean 接口,可以根据不同的配置类型返回不同类型的 Bean,它有一个比较核心的方法叫做 getObject()。
FactoryBean 在使用上也有些特殊。在前面介绍的BeanFactory 中,有一个常量叫做
FACTORY_BEAN_PREFIX = “&”,当我们想要从 Spring 容器中获取创建 Bean 的 Factory 时,可以在 beanName 前面加上 & 符号就可以获得 Bean 对应的 Factory。
我们也可以自定义 FactoryBean,用它来扩展创建 Bean的规则。在 Spring 中创建的 AOP 动态代理 Bean,就是通过实现 FactoryBean 来实现的。我们现在用的 Spring Boot、Spring Cloud 也经常通过实现 FactoryBean 接口实现自定义组件,从而修改默认的创建 Bean 的规则。
public interface FactoryBean<T> {
//从工厂中获取bean
@Nullable
T getObject() throws Exception;
//获取Bean工厂创建的对象的类型
@Nullable
Class<?> getObjectType();
//Bean工厂创建的对象是否是单例模式
default boolean isSingleton() {
return true;
}
}