面试中常被问的BeanFactory、FactoryBean、和ApplicationContext的区别

Java程序员从某种程度上可以说是Spring程序员,日常开发工作中,估计不是折腾spring全家桶就是各种框架与Spring的整合,那么作为一名Spring程序员,面试被问到BeanFactory、FactoryBean、和applicationContext的区别概率也是蛮大的,今天就个人的一些理解来说一说,不喜勿喷,欢迎指正

我们知道Sping的核心就是IOC和AOP,AOP是IOC的一个补充,或者说是基于IOC做了一些扩展,以方便做一些与业务逻辑相关性不是那么强的通用逻辑处理,比如事务、日志记录等等,而IOC的基石就是BeanFactory,我们可以看看BeanFactory的定义:

 BeanFactory作为Spring IOC容器的顶层接口,只包含了一些Bean只读操作(各种get),但是这些是远远不够的,所以spring提供了ApplicationContext,我们在看ApplicationContext的定义:

 我们可以看到ApplicationContext间接继承了BeanFactory,同时还继承了其他的接口,比如国际化、事件监听器、资源解析器等等,对比BeanFactory可以看到ApplicationContext的功能要丰富的多,那么总的来说,就是

BeanFactory是Spring容器的顶层接口,只包含了Bean的一些简单的读操作,而ApplicationContext不仅包含了BeanFactory所有的功能,还扩展了国际化等功能。

那么FactoryBean又是怎么一回事呢?

我们知道正常情况下,在Spring里面,一个Bean的创建过程是非常复杂的,整个Bean的生命周期也非常长,那么有没有一种办法可以简化Bean的创建,同时又想Bean交给Spring管理呢,FactoryBean就是为此而生的了,我们通过实现FactoryBean接口,可以实现自定义Bean的创建:

@Component
public class ServiceBFactory implements FactoryBean<ServiceB> {
    @Override
    public ServiceB getObject() throws Exception {
        return new ServiceB();
    }

    @Override
    public Class<?> getObjectType() {
        return ServiceB.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

如上面这段代码就可以实现一个简单的自定义Bean的创建过程,比起普通的Bean全程交给Spring创建要简单的多(spring创建普通的Bean的时候要讲过实例化、初始化、动态代理等等)

FactoryBean的第二个作用呢就是便于第三方框架与Spring的集成,我们知道现在的Java程序绝大多数都与Spring有关,那么其他的一些框架在使用的时候就不可避免的会去拥抱Spring这个大腿,那么这个集成的开发,只能是第三方框架自己去实现,而不是让Spring去做,比如mybatis、dubbo、hibnernate等等,当然第三方框架在与Spring集成的时候不仅仅只能通过FactoryBean来实现,我目前所知道的是有两种,一种是自定义标签的方式比如dubbo,另一种就是通过FactoryBean,比如mybatis(其实mybatis两种方式都实现了,只是我们平常用的比较多的是FactoryBean这种方式,这个有机会后面再讲)

总结一句就是:FactoryBean是为了简化Bean的创建过程,同时方便第三方框架与Spring集成

PS:通过FactoryBean创建的Bean不是存放在我们常说的Spring三级缓存中的一级缓存(普通的Bean创建完成之后是放在一级缓存的)

猜你喜欢

转载自blog.csdn.net/qq_17805707/article/details/132135205
今日推荐