spring 源码解读-FactoryBean与BeanFactory
spring 源码解读-FactoryBean与BeanFactory
一、概述
在Spring中,有两个容易混淆的类:FactoryBean与BeanFactory
- BeanFactory:bean工厂,是一个工厂,是IOC容器最顶层的接口,它的作用是管理bean,包括实例化、资源定位、配置对象以及建立对象之间的依赖。
- FactoryBean:是工厂bean,是一个bean,它的作用是产生特定bean的实例,通常这种bean没有特殊要求,仅需要提供一个工厂方法,来生成返回bean的实例, bean不需要自己实现工厂模式,Spring容器担任工厂角色,特殊情况下,其作用是产生其代理的bean。可以使用转义符**&**,来得到FactoryBean本身
BeanFactory与ApplicationContext区别?
ApplicationContext是BeanFactory的子接口,ApplicationContext提供了更完善的功能
- 支持国际化(继承MessageSource)
- 统一的资源文件访问方式
- 同时加载多个配置文件
- 提供了监听器中注册bean的事件
- 载入了多个上下文(父子容器),比如web层
区别点:
6. BeanFactory是延迟加载形式来注入bean,只有在getBean才对bean()进行实例化,这样无法发现对应的配置问题(getbean()方法才会抛出异常)
7. ApplicationContext在容器启动时一次性创建了所有的bean(单例),这样在容器启动的时候就可以发下配置问题,有利于检查依赖是否注入。
8. 相对于BeanFactory(一般编程的方式创建),ApplicationContext(声明的方式创建)唯一的不足就是占用内存空间,如果配置bean较多程序启动慢。
9. 两者都支持BeanPostProcessor,BeanFactoryPostProcessor的使用,区别在于BeanFactory需要手动注册,ApplicationContext是自动注册。
二、FactoryBean源码
public interface FactoryBean<T> {
//获取容器管理的实例对象
T getObject() throws Exception;
//获取容器管理对象的类型
Class<?> getObjectType();
//工厂创建的实例对象是否单例
boolean isSingleton();
}
AbstractBeanFactory的getBean()方法 调用的就是FactoryBean,之前分析Ioc容器实例化Bean并进行依赖注入过程时,getBean()方法触发容器实例化bean的时候,调用AbstractBeanFactory 的 doCreateBean()方法来进行实例化。
getBean()--->doGetBean()--->createBean()--->doCreateBean()
获取bean实例对象的getObjectForBeanInstance()方法中,会调用FactoryBeanRegistrySupport类的getObjectFromFactoryBean()方法。改方法实现了bean工厂生成bean实例对象。
三、AbstractBeanFactory 生成bean实例对象
真正的的是FactoryBean接口调用其实现类中getObject()方法,来实现bean对象创建的功能。
工厂bean的实现类有很多,比如Proxy、JNDI、RMI、ServletContextFactoryBean,FactoryBean接口为Spring容器提供了很好的封装机制,具体的getObject由子类去实现(根据不同的实现策略)。