FactoryBean理解上比较绕
那么这种概念,在软件工程上
或者说在平时使用上
相对于BeanFactory有啥好处?
为何要有这么个设计模式?
FactoryBean理解上比较绕
那么这种概念,在软件工程上
或者说在平时使用上
相对于BeanFactory有啥好处?
为何要有这么个设计模式?
两者不是用在同一个地方的,所以不具有相互替代性,也不具有可比性,就好比桌子腿跟勺子。你把spring框架看成一张餐桌,BeanFactory好比桌子腿,属于框架的一部分,而FactoryBean是在框架内根据业务需要来的,你喝汤可以用勺子,夹菜可以用筷子,但勺子和筷子都不能代替桌腿。
上面苏生老师的回答已经很好了,
我分享一篇分析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了。
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
BeanFactory是Spring中IOC容器最核心的接口,遵循了IOC容器中所需的基本接口。例如我们很常见的:ApplicationContext,XmlBeanFactory 等等都使用了BeanFactory这个接口。
FactoryBean是工厂类接口,当你只是想简单的去构造Bean,不希望实现原有大量的方法。它是一个Bean,不过这个Bean能够做为工厂去创建Bean,同时还能修饰对象的生成。
总结:FactoryBean比BeanFactory在生产Bean的时候灵活,还能修饰对象,带有工厂模式和装饰模式的设计思想在里面,不过它的存在还是以Bean的形式存在。
直接看MyBatis的SqlSessionFactoryBean就明白了
Spring会调用SqlSessionFactoryBean这个实现了FactoryBean的工厂Bean 同时加载dataSource,Mapper文件的路径,对sqlSessionFactory进行初始化(这里就不贴源码了 源码看一下)
BeanFactory因为是核心接口,编写复杂逻辑很容易接触到其他不必要的接口,不好实现。
如果是FactoryBean就简单很多,SqlSessionFactoryBean这个工厂Bean生产不同数据源的sqlSessionFactory,同时加载相应的配置信息。