版本:spring-framework-4.1

一概述

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

二、源码

2.1 BeanFactory

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

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

  1. public interface BeanFactory {
  2. //FactoryBean前缀
  3. String FACTORY_BEAN_PREFIX = "&";
  4. //根据名称获取Bean对象
  5. Object getBean(String name) throws BeansException;
  6. ///根据名称、类型获取Bean对象
  7. <T> T getBean(String name, Class<T> requiredType) throws BeansException;
  8. //根据类型获取Bean对象
  9. <T> T getBean(Class<T> requiredType) throws BeansException;
  10. //根据名称获取Bean对象,带参数
  11. Object getBean(String name, Object... args) throws BeansException;
  12. //根据类型获取Bean对象,带参数
  13. <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
  14. //是否存在
  15. boolean containsBean(String name);
  16. //是否为单例
  17. boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
  18. //是否为原型(多实例)
  19. boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
  20. //名称、类型是否匹配
  21. boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;
  22. //获取类型
  23. Class<?> getType(String name) throws NoSuchBeanDefinitionException;
  24. //根据实例的名字获取实例的别名
  25. String[] getAliases(String name);
  26. }

2.1 FactoryBean

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

  1. public interface FactoryBean<T> {
  2. //FactoryBean 创建的 Bean 实例
  3. T getObject() throws Exception;
  4. //返回 FactoryBean 创建的 Bean 类型
  5. Class<?> getObjectType();
  6. //返回由 FactoryBean 创建的 Bean 实例的作用域是 singleton 还是 prototype
  7. boolean isSingleton();
  8. }

三、示例

3.1 普通bean

  1. public class Dog {
  2. private String msg;
  3. public Dog(String msg){
  4. this.msg=msg;
  5. }
  6. public void run(){
  7. System.out.println(msg);
  8. }
  9. }

3.2 实现了FactoryBean的bean

  1. public class DogFactoryBean implements FactoryBean<Dog>{
  2. public Dog getObject() throws Exception {
  3. return new Dog("DogFactoryBean.run");
  4. }
  5. public Class<?> getObjectType() {
  6. return DogFactoryBean.class;
  7. }
  8. public boolean isSingleton() {
  9. return false;
  10. }
  11. }

3.3 配置文件

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

3.4 测试

  1. @Test
  2. public void testBean() throws Exception {
  3. ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  4. Dog dog1 = (Dog) ctx.getBean("dog");
  5. dog1.run();
  6. Dog dog2 = (Dog) ctx.getBean("dogFactoryBean");
  7. dog2.run();
  8. //使用&前缀可以获取FactoryBean本身
  9. FactoryBean dogFactoryBean = (FactoryBean) ctx.getBean("&dogFactoryBean");
  10. Dog dog3= (Dog) dogFactoryBean.getObject();
  11. dog3.run();
  12. }

结果输出:

  1. Dog.run
  2. DogFactoryBean.run
  3. 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. Python笔记 #15# Pandas: Missing Data

    10 Minutes to pandas import pandas as pd import numpy as np import matplotlib.pyplot as plt dates = ...

  2. c++第十八天

    p105~p108: 1.迭代器与数组的不同:迭代器的索引值必须是无符号类型,数组的索引无此要求. 2.使用数组的时候编译器一般会把它转化为指针. 3.auto ia2(数组名);的结果是:获得一个指 ...

  3. BZOj 墨墨的等式(转化为最短路)题解

    题意:中文题意不解释... 思路:这道题居然可以转化为最短路orz,要等式有非负整数解,我们可以转化一下:每个ai不限数量,问你能用ai数组拼出多少个Bmin~Bmax范围内的数,有点像完全背包的感觉 ...

  4. 创建maven或者Gradle项目的时候GroupId和ArtifactId以及Version是什么意思?

    GroupId 是项目组织的唯一标识符,在实际开发中对应JAVA的包的结构,就是main目录里java的目录结构,如 ‘com.itcast.demo’. ArtifactId是项目的唯一标识符,在实 ...

  5. mongodb的安装与增删改查

    mongodb是一款分布式的文件存储的数据库,注意这两个词,分布式和文件存储.mongodb支持复制和分片,可以合理的运用空间的大小,也可以达到容灾的目的.另外文件存储也是一个特点,抛弃了传统的表的概 ...

  6. Stub学习

    RPC RPC(Remote Procedure Call)就是某台主机A(一般为client)像调用本地的过程一样去调用另一台主机B(一般为server)上的某个过程.RPC代码可能长成这个样子: ...

  7. Flutter的需要与原生交互的一些常用库

    [说明]由于这些库一直在更新,请自己选择合适的稳定版本下载. 另外如果发现有问题或者你有更好的库,欢迎留言告诉我. 谷歌官方的针对Dart语言的一些实用性的功能以及扩展的库 -- Quiver Qui ...

  8. 同样是搞Java,年薪15W和50W到底差在哪里?

    同样是搞Java,年薪15W和50W到底差在哪里? 一.总结 一句话总结: 学习 挑战 1.扩宽自己的眼界,学着从全局看待问题,并且勇于挑战别人眼中的难题 2.持续提升你的学习能力,虽然有很多人以「在 ...

  9. 雷林鹏分享:Ruby Web Services 应用 - SOAP4R

    Ruby Web Services 应用 - SOAP4R 什么是 SOAP? 简单对象访问协议(SOAP,全写为Simple Object Access Protocol)是交换数据的一种协议规范. ...

  10. Manacher练习

    看这篇博客学了下Manacher, 讲的很好, 但他的板子写错了.. https://www.cnblogs.com/Lyush/p/3221503.html 练习1 hdu 3068最长回文 板子题 ...