版本: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. 【运维技术】shell脚本实现线程挂掉,自动重启功能

    由于分布式系统的流行,服务器上面部署的项目都是多实例的.而我又希望有一个功能,当服务器出现异常情况能够自动重启实例. 所以我想到了使用shell脚本监控实例进程id,如果不存在的话,就重启对应的实例. ...

  2. 使用cronolog工具给tomcat进行日志切割

    关于cronolog的用法查看:https://www.freebsd.org/cgi/man.cgi?query=cronolog&apropos=0&sektion=0&m ...

  3. sudo pm2 提示 找不到命令

    一共有 3 台 staging 环境服务器,5 台生产环境服务器,centos7系统.前阵子刚给所有研发配置了自己的账号,今天有小伙伴说,在其中两台服务器上 sudo pm2 list 提示: sud ...

  4. hdu_2048 错排问题

    错排问题本质上就是一个动态规划问题,其状态转移方程为: 记d[n]为n个人错排情况的总数. 那么策略可以描述为:分析第n个人错排的可能情况: 1)前n-1个人满足错排的情况,那么第n个人加入后还要错排 ...

  5. JAVA_返回一个数值的相反数的几种方式.

    一个方法接收一个int类型值,需要返回它的相反数. 如传入1,返回-1 传入-22,返回22 最简单的方式是return 0-number; 还有其他方式: public class Kata { p ...

  6. windows下hadoop安装配置(转载)

    Windows平台安装配置Hadoop 步骤: 1. JDK安装(不会的戳这) 2. 下载hadoop2.5.2.tar.gz,或者自行去百度下载. 3. 下载hadooponwindows-mast ...

  7. install ros-indigo-tf2

    sudo apt-get install ros-indigo-tf2

  8. python 获取昨天今天明天日期

    import datetime today = datetime.date.today() yesterday = today - datetime.timedelta(days = ) tomorr ...

  9. OpenGL超级宝典笔记——遮挡查询 [转]

    目录[-] 遮挡查询之前 包围体 遮挡查询 在一个场景中,如果有有些物体被其他物体遮住了不可见.那么我们就不需要绘制它.在复杂的场景中,这可以减少大量的顶点和像素的处理,大幅度的提高帧率.遮挡查询就是 ...

  10. bzoj1044: [HAOI2008]木棍分割 二分+dp

    有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且输出有多少 ...