Spring: FactoryBean相对于BeanFactory有啥好处?

发布于 2022-09-07 16:33:21 字数 93 浏览 30 评论 0

FactoryBean理解上比较绕
那么这种概念,在软件工程上
或者说在平时使用上
相对于BeanFactory有啥好处?
为何要有这么个设计模式?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

月光色 2022-09-14 16:33:21

BeanFactory是Spring中IOC容器最核心的接口,遵循了IOC容器中所需的基本接口。例如我们很常见的:ApplicationContext,XmlBeanFactory 等等都使用了BeanFactory这个接口。

FactoryBean是工厂类接口,当你只是想简单的去构造Bean,不希望实现原有大量的方法。它是一个Bean,不过这个Bean能够做为工厂去创建Bean,同时还能修饰对象的生成。

总结:FactoryBean比BeanFactory在生产Bean的时候灵活,还能修饰对象,带有工厂模式和装饰模式的设计思想在里面,不过它的存在还是以Bean的形式存在。

直接看MyBatis的SqlSessionFactoryBean就明白了

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="typeAliasesPackage" value="com.george"/>
    <property name="typeAliasesSuperType" value="com.george.common.persistence.BaseEntity"/>
    <property name="mapperLocations" value="classpath:/mappings/**/**/*.xml"/>
    <property name="configLocation" value="classpath:/mybatis-config.xml"></property>
</bean>

Spring会调用SqlSessionFactoryBean这个实现了FactoryBean的工厂Bean 同时加载dataSource,Mapper文件的路径,对sqlSessionFactory进行初始化(这里就不贴源码了 源码看一下)

BeanFactory因为是核心接口,编写复杂逻辑很容易接触到其他不必要的接口,不好实现。
如果是FactoryBean就简单很多,SqlSessionFactoryBean这个工厂Bean生产不同数据源的sqlSessionFactory,同时加载相应的配置信息。

动听の歌 2022-09-14 16:33:21

两者不是用在同一个地方的,所以不具有相互替代性,也不具有可比性,就好比桌子腿跟勺子。你把spring框架看成一张餐桌,BeanFactory好比桌子腿,属于框架的一部分,而FactoryBean是在框架内根据业务需要来的,你喝汤可以用勺子,夹菜可以用筷子,但勺子和筷子都不能代替桌腿。

栀子花开つ 2022-09-14 16:33:21

上面苏生老师的回答已经很好了,
我分享一篇分析Spring框架原理文章,Spring框架的设计理念与设计模式分析
有一段比喻我觉得非常恰当,

我们把IOC比作一个箱子,这个箱子里有若干个球的模子,可以用这些模子来造很多种不同的球,还有一个造这些球模的机器,这个机器可以产生球模。BeanFactory就是那个造球模的机器,Bean就是球模,而球模造出来的球就是Bean的实例。那么前面说的几个扩展点又在什么地方呢?BeanFactoryPostProcessor对应到 当球模被造出来时,你将有机会对其作出适当的修改,也就是它可以帮你修改球模。而InitializingBean和DisposableBean是在球模造球的开始和结束阶段,你可以完成一些预备和扫尾工作。BeanPostProcessor就可以让你对球模造出来的球进行适当的修正。最后还有一个FactoryBean,它是一个神奇的球模。这个球模不是预先就定型了,而是由你来确定它们的形状,既然你可以确定这个球模的形状,它造出来的球当然是你想要的球了。

Spring是以Bean为核心的,一般都是根据BeanDefinition生成期望的Bean,那么FactoryBean在BeanDefinition和最终的Bean中间,一部分灵活性交给配置(xml或JavaConfig),一部分定制逻辑交给继承FactoryBean的子类的getObject方法;关于它的好处,比如整合第三方框架,比如定制工厂逻辑,如池化,没有FactoryBean的辅助,从raw BeanDefinition生成Bean实现起来可能就比较复杂了;

以上是关于FactoryBean的一点心得,它和BeanFactory不是一回事;

BeanFactory是一个容器,它的工厂逻辑是利用原材料BeanDefinition生成Bean,在目的上和FactoryBean有相似之处,明显它的定制性特点就不如FactoryBean了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文