转自:http://blog.csdn.net/wangbiao007/article/details/53183764

1.BeanFactory

BeanFactory是IOC最基本的容器,负责生产和管理bean,它为其他具体的IOC容器提供了最基本的规范,例如DefaultListableBeanFactory,

XmlBeanFactory,ApplicationContext 等具体的容器都是实现了BeanFactory,再在其基础之上附加了其他的功能。

BeanFactory源码

  1. package org.springframework.beans.factory;
  2. import org.springframework.beans.BeansException;
  3. public interface BeanFactory {
  4. String FACTORY_BEAN_PREFIX = "&";
  5. Object getBean(String name) throws BeansException;
  6. <T> T getBean(String name, Class<T> requiredType) throws BeansException;
  7. <T> T getBean(Class<T> requiredType) throws BeansException;
  8. Object getBean(String name, Object... args) throws BeansException;
  9. boolean containsBean(String name);
  10. boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
  11. boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
  12. boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;
  13. Class<?> getType(String name) throws NoSuchBeanDefinitionException;
  14. String[] getAliases(String name);
  15. }

2.FactoryBean

FactoryBean是一个接口,当在IOC容器中的Bean实现了FactoryBean后,通过getBean(String BeanName)获取到的Bean对象并不是FactoryBean的实现类对象,而是这个实现类中的getObject()方法返回的对象。要想获取FactoryBean的实现类,就要getBean(&BeanName),在BeanName之前加上&。

FactoryBean源码

  1. package org.springframework.beans.factory;
  2. public interface FactoryBean<T> {
  3. T getObject() throws Exception;
  4. Class<?> getObjectType();
  5. boolean isSingleton();
  6. }

下面是一个应用FactoryBean的例子

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xmlns:tx="http://www.springframework.org/schema/tx"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context-3.0.xsd
  10. http://www.springframework.org/schema/aop
  11. http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
  12. http://www.springframework.org/schema/tx
  13. http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
  14. <bean id="student" class="com.spring.bean.Student">
  15. <property name="name" value="zhangsan" />
  16. </bean>
  17. <bean id="school" class="com.spring.bean.School">
  18. </bean>
  19. <bean id="factoryBeanPojo" class="com.spring.bean.FactoryBeanPojo">
  20. <property name="type" value="student" />
  21. </bean>
  22. </beans>

FactoryBean的实现类

  1. import org.springframework.beans.factory.FactoryBean;
  2. /**
  3. * @author  作者 wangbiao
  4. * @date 创建时间:2016年11月14日 上午11:19:31
  5. * @parameter
  6. * @return
  7. */
  8. public class FactoryBeanPojo implements FactoryBean{
  9. private String type;
  10. @Override
  11. public Object getObject() throws Exception {
  12. if("student".equals(type)){
  13. return new Student();
  14. }else{
  15. return new School();
  16. }
  17. }
  18. @Override
  19. public Class getObjectType() {
  20. return School.class;
  21. }
  22. @Override
  23. public boolean isSingleton() {
  24. return true;
  25. }
  26. public String getType() {
  27. return type;
  28. }
  29. public void setType(String type) {
  30. this.type = type;
  31. }
  32. }

普通的bean

  1. /**
  2. * @author  作者 wangbiao
  3. * @date 创建时间:2016年11月14日 上午11:13:18
  4. * @parameter
  5. * @return
  6. */
  7. public class School {
  8. private String schoolName;
  9. private String address;
  10. private int studentNumber;
  11. public String getSchoolName() {
  12. return schoolName;
  13. }
  14. public void setSchoolName(String schoolName) {
  15. this.schoolName = schoolName;
  16. }
  17. public String getAddress() {
  18. return address;
  19. }
  20. public void setAddress(String address) {
  21. this.address = address;
  22. }
  23. public int getStudentNumber() {
  24. return studentNumber;
  25. }
  26. public void setStudentNumber(int studentNumber) {
  27. this.studentNumber = studentNumber;
  28. }
  29. @Override
  30. public String toString() {
  31. return "School [schoolName=" + schoolName + ", address=" + address
  32. + ", studentNumber=" + studentNumber + "]";
  33. }
  34. }

测试类

  1. import org.springframework.context.support.ClassPathXmlApplicationContext;
  2. import com.spring.bean.FactoryBeanPojo;
  3. /**
  4. * @author  作者 wangbiao
  5. * @date 创建时间:2016年11月14日 上午11:11:35
  6. * @parameter
  7. * @return
  8. */
  9. public class FactoryBeanTest {
  10. public static void main(String[] args){
  11. String url = "com/spring/config/BeanConfig.xml";
  12. ClassPathXmlApplicationContext cpxa = new ClassPathXmlApplicationContext(url);
  13. Object school=  cpxa.getBean("factoryBeanPojo");
  14. FactoryBeanPojo factoryBeanPojo= (FactoryBeanPojo) cpxa.getBean("&factoryBeanPojo");
  15. System.out.println(school.getClass().getName());
  16. System.out.println(factoryBeanPojo.getClass().getName());
  17. }
  18. }

输出的结果:

  1. 十一月 16, 2016 10:28:24 上午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
  2. INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1e8ee5c0: startup date [Wed Nov 16 10:28:24 CST 2016]; root of context hierarchy
  3. 十一月 16, 2016 10:28:24 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
  4. INFO: Loading XML bean definitions from class path resource [com/spring/config/BeanConfig.xml]
  5. 十一月 16, 2016 10:28:24 上午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
  6. INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@35b793ee: defining beans [student,school,factoryBeanPojo]; root of factory hierarchy
  7. com.spring.bean.Student
  8. com.spring.bean.FactoryBeanPojo

从结果上可以看到当从IOC容器中获取FactoryBeanPojo对象的时候,用getBean(String BeanName)获取的确是Student对象,可以看到在FactoryBeanPojo中的type属性设置为student的时候,会在getObject()方法中返回Student对象。所以说从IOC容器获取实现了FactoryBean的实现类时,返回的却是实现类中的getObject方法返回的对象,要想获取FactoryBean的实现类,得在getBean(String BeanName)中的BeanName之前加上&,写成getBean(String &BeanName)。

3.BeanFactory和FactoryBean的区别

BeanFactory和FactoryBean其实没有什么比较性的,只是两者的名称特别接近,所以有时候会拿出来比较一番,BeanFactory是提供了OC容器最基本的形式,给具体的IOC容器的实现提供了规范,FactoryBean可以说为IOC容器中Bean的实现提供了更加灵活的方式,FactoryBean在IOC容器的基础上给Bean的实现加上了一个简单工厂模式和装饰模式,我们可以在getObject()方法中灵活配置。其实在Spring源码中有很多FactoryBean的实现类,要想深入准确的理解FactoryBean,只有去读读Spring源码了。

BeanFactory和FactoryBean的区别的更多相关文章

  1. Spring BeanFactory与FactoryBean的区别及其各自的详细介绍于用法

    Spring BeanFactory与FactoryBean的区别及其各自的详细介绍于用法 1. BeanFactory BeanFactory,以Factory结尾,表示它是一个工厂类(接口),用于 ...

  2. Spring中BeanFactory与FactoryBean的区别

    在Spring中有BeanFactory和FactoryBean这2个接口,从名字来看很相似,比较容易搞混. 一.BeanFactory BeanFactory是一个接口,它是Spring中工厂的顶层 ...

  3. BeanFactory 和FactoryBean的区别

    转自:https://www.cnblogs.com/aspirant/p/9082858.html BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是 ...

  4. 转:BeanFactory和FactoryBean的区别

    一.BeanFactory简介 BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的BeanFactory.原始的BeanFactory无法支持 ...

  5. 【Java面试】Spring中 BeanFactory和FactoryBean的区别

    一个工作了六年多的粉丝,胸有成竹的去京东面试. 然后被Spring里面的一个问题卡住,唉,我和他说,6年啦,Spring都没搞明白? 那怎么去让面试官给你通过呢? 这个问题是: Spring中Bean ...

  6. Spring BeanFactory 与 FactoryBean 的区别

    BeanFactory 和 FactoryBean 都是Spring Beans模块下的接口 BeanFactory是spring简单工厂模式的接口类,spring IOC特性核心类,提供从工厂类中获 ...

  7. spring中BeanFactory和FactoryBean的区别

    共同点: 都是接口 区别: BeanFactory 以Factory结尾,表示它是一个工厂类,用于管理Bean的一个工厂 在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器 ...

  8. 【Spring】2、BeanFactory 和FactoryBean的区别

    转自:http://chenzehe.iteye.com/blog/1481476 1. BeanFactory BeanFactory定义了 IOC 容器的最基本形式,并提供了 IOC 容器应遵守的 ...

  9. spring中的BeanFactory和FactoryBean的区别与联系

    首先,这俩都是个接口… 实现 BeanFactory 接口的类表明此类是一个工厂,作用就是配置.新建.管理 各种Bean. 而 实现 FactoryBean 的类表明此类也是一个Bean,类型为工厂B ...

随机推荐

  1. 5)协程二(yeild from)

     一:yield from说明 python从3.3版本开始使用yield from 替代yield  yield from 结构会在内部自动捕获 StopIteration 异常. 这种处理方式与 ...

  2. ORACLE透明加密

    --官网文档:https://www.oracle.com/technetwork/cn/tutorials/tde-096009-zhs.html#t概述Oracle 数据库 10g 第 2 版透明 ...

  3. vue---分页搜索功能

    <template> <div> <div class="searc"> <input type="search" p ...

  4. Swift 学习- 07 -- 函数

    // 函数 // 函数是一段完成特定任务的独立代码片段, 你可以通过给函数命名来标识某个函数的功能, 这个名字可以被用来在需要的时候'调用'这个函数来完成它的任务 // swift 统一的函数语法非常 ...

  5. Oracle 闪回

    Oracle 闪回特性(FLASHBACK DATABASE) 本文来源于:gerainly 的<Oracle 闪回特性(FLASHBACK DATABASE) > -========== ...

  6. Swift可选项

  7. linux之xxx 不在 sudoers 文件中,此事将被报告(转载)

    linux中创建用户命令为:useradd 用户名, eg: useradd test 指定密码:passwd test 但是有时候我们需要使用test运行执行一些root用户才有权限执行的命令,此时 ...

  8. Ubuntu 安装google 拼音

    一.安装fcitx apt-get install fcitx 二.安装google pinyin sudo apt install fcitx-googlepinyin 三. 安装 fcitx-co ...

  9. java 命令行运行时报错:找不到或无法加载主类

    源码如下: 路径目录(...\src\object) //: ch1.10/Command.java /**@author feilong * @version 1.0 */ package obje ...

  10. poj2116 模拟题

    不知道错在哪里 /* 给定两个斐波那契表示数,要求用标准化表达方式表达 然后将这两个数加起来,和也用标准化方式表达 思路:显然要将这两个数先用十进制表示,和也用十进制表示 然后在转化成二进制即可 1 ...