1. BeanFactory

  BeanFactory,以Factory结尾,表示它是一个工厂类(接口),用于管理Bean的一个工厂。在Spring中,BeanFactory是IOC容器的核心接口,也是最顶层的定义。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

接口里面有如下方法:

  • Object getBean(String name) 返回给定名称注册的bean实例。根据bean的配置情况,如果是singleton模式将返回一个共享实例,否则将返回一个新建的实例,如果没有找到指定bean,该方法可能会抛出异常
  • <T> T getBean(String name, Class<T> requiredType) 返回以给定名称注册的bean实例,并转换为给定class类型
  • <T> T getBean(Class<T> requiredType) 返回以给定名称注册的bean实例,并转换为给定class类型,如果检索出不是唯一个bean,会抛异常(找不到bean异常或bean不是唯一异常)
  • Object getBean(String name,Object... agrs) 返回以给定名称注册的bean实例,并且将当前的参数agrs覆盖默认值(如果有的话),该实例需要通过一个工厂类静态方法来产生,且要求是原型模式
  • class ExampleBean {
    private String string;
    public ExampleBean(String string) {
    this.string = string;
    }
    } class ExampleBeanFactory {
    public static ExampleBean createExampleBean(String string) {
    return new ExampleBean(string);
    }
    } <bean id="exampleBean" class="...ExampleBeanFactory" scope="prototype"
    factory-method="createExampleBean">
    <constructor-arg value="default value"/>
    </bean> public class Main {
    public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext(
    "context.xml");
    ExampleBean exampleBean =
    ExampleBean)context.getBean("exampleBean",
    new Object[]{"bla bla"});
    exampleBean.write();
    }
    }
  • <T> T getBean(Class<T> requiredType,Object... agrs) 返回以给定class注册的bean实例,并且将当前的参数agrs覆盖默认值(如果有的话),该实例需要通过一个工厂类静态方法来产生,且要求是原型模式
  • boolean containsBean(String beanName) 判断工厂中是否包含给定名称的bean定义,若有则返回true
  • boolean isSingleton(String name) 判断给定名称的bean定义是否为单例模式
  • boolean isProtoType(String name) 判断给定名称的bean定义是否为原型模式
  • boolean isTypeMatch(String name,ResolvableType typeToMatch) 判断给定名称的bean定义是否是给定的类型
  • boolean isTypeMatch(String name,Class<?> typeToMatch) 判断给定名称的bean定义是否是给定的类型
  • String[] getAliases(String name) 返回给定bean名称的所有别名
  • Class getType(String name) 返回给定名称的bean的Class,如果没有找到指定的bean实例,则排除NoSuchBeanDefinitionException异常

2. FactoryBean

一般情况下,Spring通过反射机制利用bean的class属性指定实现类来实例化bean 。在某些情况下,实例化bean过程比较复杂,如果按照传统的方式,则需要在<bean>中提供大量的配置信息,配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。Spring为此提供了一个org.Springframework.bean.factory.FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化bean的逻辑。根据该Bean的ID从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FactoryBean本身,如果要获取FactoryBean对象,请在id前面加一个&符号来获取。

  • TgetObject():返回由FactoryBean创建的Bean实例,如果isSingleton()返回true,则该实例会放到Spring容器中单实例缓存池中;
  • booleanisSingleton():返回由FactoryBean创建的Bean实例的作用域是singleton还是prototype;
  • Class<T>getObjectType():返回FactoryBean创建的Bean类型。

3. 区别

BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的,包括FactoryBean。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似。FactoryBean每次只要将持有的对象引用返回即可。

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

  1. 一文读懂BeanFactory和FactoryBean区别

    一直以来,很多人对于Spring中的BeanFactory和FactoryBean都是分不清楚的 BeanFactory 这个其实是所有Spring Bean的容器根接口,给Spring 的容器定义一 ...

  2. BeanFactory和FactoryBean的区别

    转自:http://blog.csdn.net/wangbiao007/article/details/53183764 1.BeanFactory BeanFactory是IOC最基本的容器,负责生 ...

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

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

  4. Spring中BeanFactory与FactoryBean的区别

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

  5. BeanFactory 和FactoryBean的区别

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

  6. Spring中BeanFactory与FactoryBean到底有什么区别?

    一.BeanFactory BeanFactory是一个接口,它是Spring中工厂的顶层规范,是SpringIoc容器的核心接口,它定义了getBean().containsBean()等管理Bea ...

  7. 转:BeanFactory和FactoryBean的区别

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

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

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

  9. Difference between BeanFactory and FactoryBean in Spring Framework (Spring BeanFactory与Factory区别)

    参见原文:http://www.geekabyte.io/2014/11/difference-between-beanfactory-and.html geekAbyte Codes and Ran ...

  10. Spring BeanFactory 与 FactoryBean 的区别

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

随机推荐

  1. vue 移动端px转rem

    1.安装lib-flexible 终端执行命令:npm i lib-flexible --save 2.在main.js引入lib-flexible 3.终端执行命令:npm install post ...

  2. 使用CefSharp获取A标签中的内容

    js = @"(function (){ return document.querySelectorAll('a')[0].innerHTML})(); "; chromeBrow ...

  3. MindManager离线安装包官网下载

    软件官网:https://www.mindjet.com/ 注意:不建议在思杰马克丁及其相关合作网站下载该软件,更不建议在其旗下站点购买该软件授权. 目前来说,官网正常下载的话它会要求你填写一些信息, ...

  4. 「SOL」Hamiltonian Cycle (AtCoder)

    原来一般的四度图也没法快速构造哈密顿回路 QwQ # 题面 给定质数 \(P\) 和正整数 \(a,b\),构造一个长为 \(P\) 的数列 \(G=(g_1,g_2,\dots,g_P)\),满足: ...

  5. java 项目中Error linstenerStart 报错解决方法

    项目中经常会遇到如下报错: 严重:Error linstenerStart 这种报错,我们看不出来到底是出现了什么问题.下面我们就一步一步来解决: (1)首先进入项目的classes目录下: (2)进 ...

  6. adaptsegnet 论文分析比较好的

    https://blog.csdn.net/weixin_43795588/article/details/118058775 常用的语义分割一般是由两部分组成:一部分是特征提取器,比如可以用Resn ...

  7. 使用IScroll组件出现滑动卡顿问题解决方法

    var is = new IScroll('#wrapper2', { scrollX: true, scrollY: false, click: true, keyBindings: true, / ...

  8. 树莓派启动后自动连接wifi

    安装好系统后我们先使用 网线进行连接 使用ssh 工具连接 cd /etc/wpa_supplicant/ wpa_passphrase "网络名称" "密码" ...

  9. edge 浏览器部分功能

    模拟打印情况的调试

  10. 修改mysql root密码,在workbench中导入.sql文件

    修改mysql root密码: 1.如果没有配置环境变量,在 \Program Files\MySQL\MySQL Server 8.0\bin 文件下 Shit+右键打开 Powershell 窗口 ...