版本:spring-framework-4.1

一概述

BeanFactory 与 FactoryBean的区别, 两个名字很像,面试中也经常遇到,所以容易搞混,现从源码以及示例两方面来分析。

二、源码

2.1 BeanFactory

BeanFactory定义了 IOC 容器的最基本形式,并提供了 IOC 容器应遵守的的最基本的接口,也就是 Spring IOC 所遵守的最底层和最基本的编程规范。

BeanFactory仅是个接口,并不是IOC容器的具体实现,具体的实现有:如 DefaultListableBeanFactory 、 XmlBeanFactory 、 ApplicationContext 等。

public interface BeanFactory {
//FactoryBean前缀
String FACTORY_BEAN_PREFIX = "&"; //根据名称获取Bean对象
Object getBean(String name) throws BeansException; ///根据名称、类型获取Bean对象
<T> T getBean(String name, Class<T> requiredType) throws BeansException; //根据类型获取Bean对象
<T> T getBean(Class<T> requiredType) throws BeansException; //根据名称获取Bean对象,带参数
Object getBean(String name, Object... args) throws BeansException; //根据类型获取Bean对象,带参数
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException; //是否存在
boolean containsBean(String name); //是否为单例
boolean isSingleton(String name) throws NoSuchBeanDefinitionException; //是否为原型(多实例)
boolean isPrototype(String name) throws NoSuchBeanDefinitionException; //名称、类型是否匹配
boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException; //获取类型
Class<?> getType(String name) throws NoSuchBeanDefinitionException; //根据实例的名字获取实例的别名
String[] getAliases(String name);
}

2.1 FactoryBean

FactoryBean工厂类接口,用户可以通过实现该接口定制实例化 Bean 的逻辑。

public interface FactoryBean<T> {

    //FactoryBean 创建的 Bean 实例
T getObject() throws Exception; //返回 FactoryBean 创建的 Bean 类型
Class<?> getObjectType(); //返回由 FactoryBean 创建的 Bean 实例的作用域是 singleton 还是 prototype
boolean isSingleton();
}

三、示例

3.1 普通bean

public class Dog {
private String msg; public Dog(String msg){
this.msg=msg;
}
public void run(){
System.out.println(msg);
}
}

3.2 实现了FactoryBean的bean

public class DogFactoryBean implements FactoryBean<Dog>{

    public Dog getObject() throws Exception {
return new Dog("DogFactoryBean.run");
} public Class<?> getObjectType() {
return DogFactoryBean.class;
} public boolean isSingleton() {
return false;
}
}

3.3 配置文件

<bean id="dog" class="com.bean.Dog" >
<constructor-arg value="Dog.run"/>
</bean> <bean id="dogFactoryBean" class="com.bean.DogFactoryBean" />

3.4 测试

@Test
public void testBean() throws Exception {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); Dog dog1 = (Dog) ctx.getBean("dog");
dog1.run(); Dog dog2 = (Dog) ctx.getBean("dogFactoryBean");
dog2.run(); //使用&前缀可以获取FactoryBean本身
FactoryBean dogFactoryBean = (FactoryBean) ctx.getBean("&dogFactoryBean");
Dog dog3= (Dog) dogFactoryBean.getObject();
dog3.run();
}

结果输出:

Dog.run
DogFactoryBean.run
DogFactoryBean.run

四、总结

通过以上源码和示例来看,基本上能印证以下结论,也就是二者的区别。

  1. BeanFactory是个Factory,也就是 IOC 容器或对象工厂,所有的 Bean 都是由 BeanFactory( 也就是 IOC 容器 ) 来进行管理。

  2. FactoryBean是一个能生产或者修饰生成对象的工厂Bean,可以在IOC容器中被管理,所以它并不是一个简单的Bean。当使用容器中factory bean的时候,该容器不会返回factory bean本身,而是返回其生成的对象。

Spring中FactoryBean与BeanFactory的区别的更多相关文章

  1. Spring 中 ApplicationContext 和 BeanFactory 的区别,以及 Spring bean 作用域

    //从ApplicationContext 中取 bean ApplicationContext ac = new ClassPathXmlApplicationContext ( "com ...

  2. Spring 中 ApplicationContext 和 BeanFactory 的区别

    //从ApplicationContext 中取 bean ApplicationContext ac = new ClassPathXmlApplicationContext ( "com ...

  3. Spring中ClassPathXmlApplication与FileSystemXmlApplicationContext的区别

    Spring中ClassPathXmlApplication与FileSystemXmlApplicationContext的区别 一.概述 在项目中遇到加载不到Spring配置文件,简单分析后,写此 ...

  4. Spring中ApplicationContext和beanfactory区别---解析一

    BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的BeanFactory.原始的BeanFactory无法支持spring的许多插件,如AOP ...

  5. Spring中ApplicationContext和beanfactory区别

    BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的BeanFactory.原始的BeanFactory无法支持spring的许多插件,如AOP ...

  6. 7.FactoryBean 和BeanFactory去区别

    FactoryBean源码: /* * Copyright 2002-2012 the original author or authors. * * Licensed under the Apach ...

  7. Spring中FactoryBean的作用和实现原理

    BeanFactory与FactoryBean,相信很多刚翻看Spring源码的同学跟我一样很好奇这俩货怎么长得这么像,分别都是干啥用的.BeanFactory是Spring中Bean工厂的顶层接口, ...

  8. 一文带你解读Spring5源码解析 IOC之开启Bean的加载,以及FactoryBean和BeanFactory的区别。

    前言 通过往期的文章我们已经了解了Spring对XML配置文件的解析,将分析的信息组装成BeanDefinition,并将其保存到相应的BeanDefinitionRegistry中,至此Spring ...

  9. Spring中的接口BeanFactory和FactoryBean的学习

    BeanFactory: 相当于对象工厂,可以获取对象的实例以及相应的属性.BeanFactory定义了IOC容器的最基本形式,并提供了IOC容器应遵守的的最基本的接口,也就是Spring IOC所遵 ...

随机推荐

  1. loj2163 / bzoj2212 / P3521 [POI2011]ROT-Tree Rotations(线段树合并)

    P3521 [POI2011]ROT-Tree Rotations loj2163 [POI2011]ROT-Tree Rotations(数据加强) (loj的数据套了个fread优化才过...) ...

  2. 20145325张梓靖 实验四 "Andoid开发基础"

    20145325张梓靖 实验四 "Andoid开发基础" 实验内容 使用 Android Studio 设计"Hello" 设计过程 创建项目 选择.xml中的 ...

  3. 搭建linux上的Eclipse+PHP编程环境

    最近打算学PHP,于是查阅资料搭建了ubuntu(14.04.3)上的PHP IDE环境 一.准备工作(可略) 主要是推荐科大的源和配置源的方法,因为后于步骤使用到了apt,科大的源非常快,并且有个针 ...

  4. openwrt编译系统生成ubi镜像的各变量解析

    1.MKUBIFS_OPTS的作用 传递参数给mkfs.ubifs 2.MKUBIFS_OPTS传递了哪些参数? 传递了最小输入输出单元大小.逻辑擦除块大小.最大物理擦除块的个数,分别由选项-m.-e ...

  5. Python学习札记(二十八) 模块1

    参考:模块 NOTE 1.模块:一个.py文件称为一个模块. 2.代码模块化的意义:a.提升程序的可维护性 b.不用重复造轮子 3.避免模块冲突,解决方法:引入了按目录来组织模块的方法,称为包(Pac ...

  6. 现在 做java 构架(RabbitMQ redis mysql )之类的

    现在 做java 构架(RabbitMQ redis mysql )之类的

  7. UOJ #164 【清华集训2015】 V

    题目链接:V 这道题由于是单点询问,所以异常好写. 注意到每种修改操作都可以用一个标记\((a,b)\)表示.标记\((a,b)\)的意义就是\(x= \max\{x+a,b\}\) 同时这种标记也是 ...

  8. Factory Method(工厂方法)

    Factory Method(工厂方法) 意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method 使一个类的实例化延迟到其子类. 适用性: 当一个类不知道它所必须创 ...

  9. R语言绘制正太分布图,并进行正太分布检验

    正态分布 判断一样本所代表的背景总体与理论正态分布是否没有显著差异的检验.   方法一概率密度曲线比较法 看样本与正太分布概率密度曲线的拟合程度,R代码如下: #画样本概率密度图s-rnorm(100 ...

  10. Android:你好,androidX!再见,android.support

    1.AndroidX简介 点击查看Android文档中对androidx的简介 按照官方文档说明 androidx 是对 android.support.xxx 包的整理后产物.由于之前的suppor ...