Difference between BeanFactory and FactoryBean in Spring Framework (Spring BeanFactory与Factory区别)
参见原文:http://www.geekabyte.io/2014/11/difference-between-beanfactory-and.html
Codes and Rants | Javascript, Java and Scala
Saturday, November 15, 2014
Difference between BeanFactory and FactoryBean in Spring Framework
tl;dr A FactoryBean is an interface that you, as a developer, implements when writing factory classes and you want the object created by the factory to be managed as a bean by Spring, while a BeanFactory on the other hand, represents the Spring IoC container, it contains the managed beans and provides access to retrieving them. It is part of the core of the framework which implements the base functionality of an inversion of control container.
This post clarifies the difference between BeanFactory and FactoryBean in Spring Framework, and in the processes sheds some light on how the core component of Spring Frameworks stack together.
The Spring Framework has grown to be a lot of things, but at its core, it is a very versatile Dependency Injection container, upon which other things get built on. This core, this dependency injection container is actually built from 4 components.
1. The org.springframework.core package. In which, base functionalities that cut across the whole framework is implemented, e.g. exceptions, version detection etc.
2. The org.springframework.beans package. In which we have interfaces and classes for managing Java beans. The BeanFactory interface is found here.
3. The org.springframework.context Package. This builds on the beans package. An example of an interface out of this package that you would have used is the ApplicationContext (it implements the BeanFactory interface)
4. The org.springframework.expression package. This provides the expression language that can be used to traverse and manipulate the object graph within the container at runtime.
Diagrammatically this would look thus:
The places where the IoC container mechanism is implemented is mainly in Spring-Beans
package with supporting base functionality from Spring-Core and (Spring-Context builds on these two, extending it and adding additional functionalities certain). By the way, the fact that Spring-Context builds on Spring-Core and Spring-Beans is why only including Spring-Context as a dependency is all you need to get access to the Spring IoC container functionality in your application.
The functionality for creating, wiring and managing beans are packed into the org.springframework.beans. It is in this package we have BeanFactory and in a sub package (org.springframework.beans.factory) that you would find FactoryBean. The two interfaces that are the subject of this post.
The question then is, how does the BeanFactory and FactoryBean interfaces differ?
Apart from the fact that they share the same root package and are both anagrams (which make them confusing), they serve two totally different purposes.
A FactoryBean is an interface that you, as a developer, implements when writing factory classes and you want the object created by the factory class to be managed as a bean by Spring, while a BeanFactory on the other hand, represents the Spring IoC container, it contains the managed beans and provides access to retrieving them. It is part of the core of the framework which implements the base functionality of an inversion of control container.
In most cases, you won't find yourself using or implementing the BeanFactory interface directly, unless you are extending the core functionality of the framework. While you would do implement the FactoryBean when you have objects that are created by Factories that needs to be managed by Spring.
In more succinct words, the BeanFactory represents the Spring container while the FactoryBean represents factory classes whose created object are picked up and registered as a bean in the container.
To get more feel of these two, let us quickly take a look at two instances from the framework where they are put to use:
LocalContainerEntityManagerFactoryBean as an example of a FactoryBean
In configuring Hibernate JPA in Spring Framework, I mentioned the role of the org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean in the configuration process when creating a container managed EntityManagerFactory. It is the class that is wired up in the configuration. E.g:
- <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
- <!-- the data source -->
- <property name="dataSource" ref="dataSource"></property>
- <!-- configuration that specifies the JPA Adapter to use -->
- <property name="jpaVendorAdapter">
- <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
- </bean>
- </property>
- <!-- configuration to specify JPA behaviors -->
- <property name="jpaProperties">
- <props>
- <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
- <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
- </props>
- </property>
- </bean>
But if you look at the configuration, the class that is being wired up is of type LocalContainerEntityManagerFactoryBean, how come, it then produces a bean of type EntityManagerFactory?
That is because LocalContainerEntityManagerFactoryBean is a factory that creates and returns an object of type EntityManagerFactory. And because it implements FactoryBeaninterface, when configured, the Spring container knows that the registered bean won't be of type LocalContainerEntityManagerFactoryBean, but the type it returns in its getObject() method.
That is an example of what FactoryBean is used for.
ClassPathXmlApplicationContext as an example of BeanFactory.
The ClassPathXmlApplicationContext is one of the ways you can initiate Springs IoC container. You supply it with the configuration(s), it does the necessary object resolution and dependency injection and returns to you a container from which you can retrieve a fully resolved bean.
For example:
- ApplicationContext context =
- new ClassPathXmlApplicationContext("classpath:context-config.xml");
ClassPathXmlApplicationContext is of type ApplicationContext, and the ApplicationContext interface itself is found in the Spring-Context (refer to the diagram above).
The Spring-Context module part of the core component, contains classes and interfaces that provides enhanced functionality over the Spring-Beans and Spring-Core modules. The ApplicationContext interface is one of such convenience found in the Spring-Context module as it defines amongst various functionalities, the ability to retrieve beans from the container, ability to load file resources in a generic fashion, internationalization support etc...
But the ApplicatonContext interface is itself a type of BeanFactory as it extends the BeanFactory interface indirectly by extending the ListableBeanFactory and HierarchicalBeanFactory, as its signature shows:

Which means whenever you use any of the classes that implements the ApplicationContext(ClassPathXmlApplicationContext, FileSystemXmlApplicationContext, etc) you are accessing and using the Spring Container, through interfaces that are extension of the base BeanFactory interface.
Difference between BeanFactory and FactoryBean in Spring Framework (Spring BeanFactory与Factory区别)的更多相关文章
- Spring中的BeanFactory与FactoryBean看这一篇就够了
前言 理解FactoryBean是非常非常有必要的,因为在Spring中FactoryBean最为典型的一个应用就是用来创建AOP的代理对象,不仅如此,而且对理解Mybatis核心源码也非常有帮助!如 ...
- Spring Framework(框架)整体架构 变迁
Spring Framework(框架)整体架构 2018年04月24日 11:16:41 阅读数:1444 标签: Spring框架架构 更多 个人分类: Spring框架 版权声明:本文为博主 ...
- 1.Spring Framework 5.0 入门篇
1.为什么学习Spring? 随着对Java EE的不断接触和理解,你会发现Spring 在各个企业和项目中发挥着越来越重要的作用.掌握Spring 已成为我们IT行业生存必学的本领之一. Spri ...
- Benefits of Using the Spring Framework Dependency Injection 依赖注入 控制反转
小结: 1. Dependency Injection is merely one concrete example of Inversion of Control. 依赖注入是仅仅是控制反转的一个具 ...
- Spring学习笔记——Spring中的BeanFactory与FactoryBean
BeanFactory BeanFactory是Spring的org.springframework.beans.factory下的一个接口,是Spring IOC所遵守的基本编程规范.他的实现类有D ...
- Spring Framework 组件注册 之 FactoryBean
Spring Framework 组件注册 之 FactoryBean 前言 前两篇文章介绍了如何使用@Component,@Import注解来向spring容器中注册组件(javaBean),本文将 ...
- [spring源码学习]六、IOC源码-BeanFactory和factory-bean
一.代码实例 在我们分析spring的IOC源码的时候,发现除了配置标准的bean,并且通过getBean(beanName)的方法获取到一个bean的实例外,似乎还有这不少其他获取的方法,例如在第四 ...
- Spring BeanFactory与FactoryBean的区别及其各自的详细介绍于用法
Spring BeanFactory与FactoryBean的区别及其各自的详细介绍于用法 1. BeanFactory BeanFactory,以Factory结尾,表示它是一个工厂类(接口),用于 ...
- 理解spring中的BeanFactory和FactoryBean的区别与联系
原文地址:http://blog.csdn.net/joenqc/article/details/66479154 首先,这俩都是个接口… 实现 BeanFactory 接口的类表明此类事一个工厂,作 ...
随机推荐
- 【Spring】29、SpringBoot中@SpringBootApplication的使用
之前用户使用的是3个注解注解他们的main类.分别是@Configuration,@EnableAutoConfiguration,@ComponentScan.由于这些注解一般都是一起使用,spri ...
- 6.方法_EJ
第38条: 检查参数的有效性 对于这一条,最常见的莫过于检查参数是否为null. 有时出现调用方未检查传入的参数是否为空,同时被调用方也没有检查参数是否为空,结果这就导致两边都没检查以至于出现null ...
- JS经典题目解析
此次列举出一些觉得有意思的JS题目(来源于出了名的44题),相信有非常多关于这些题目的博客,写这篇博客的目的在于巩固一些知识点,希望能和读者共同进步. 1. map函数执行过程 ["1&qu ...
- 函数多个返回值与unpack的用法
-- return the index of max number and himself -- 函数可以返回多个值 function get_max( T ) ] for i, v in ipair ...
- 今天学习了flex布局
前言:这个网站详细讲了水平.垂直.水平垂直的css方法.https://css-tricks.com/centering-css-complete-guide/ 布局的传统解决方案,基于盒状模型,依赖 ...
- 2018-08-29 浏览器插件实现GitHub代码翻译原型演示
此原型源自此想法: 中文化源码. 考虑到IDE插件工作量较大, 且与IDE绑定. 在代码转换工具的各种实现中, 综合考虑实用+易用+长远改进潜力, 浏览器插件似乎较有优势. 于是用最快捷的方式实现这一 ...
- (其他)Thinkpad笔记本装系统
电脑城装一次系统收你40元,不如自己装系统. 虽然百度上装系统的文章泛滥,但是还是自己尝试. 前3个小时thinkpad e570是不是坏掉了,怎么就进不去BIOS,这个时候直接搜索这个型号,问题输入 ...
- Spark性能优化【Stack Overflow】
一.异常情况 Stack Overflow 二.异常分析 之所以会产生Stack Overflow,原因是在Stack方法栈中方法的调用链条太长的原因导致的,一般情况有两种: 1.过于深度的递归[常见 ...
- mssql sql server上如何建一个只读视图–视图锁定的另类解决方案
转自:http://www.maomao365.com/?p=4508 <span style="color:red;font-weight:bold;">我们熟知一个 ...
- Mycat实现Mysql主从读写分离
一.概述 关于Mycat的原理网上有很多,这里不再详述,对于我来说Mycat的功能主要有如下几种: 1.Mysql主从的读写分离 2.Mysql大表分片 3.其他数据库例如Oracle,MSSQL,D ...