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. 理解函数调用_使用严格模式边使用arguments别名

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. antd DatePicker限制日期的选择

    import React from 'react'; import ReactDOM from 'react-dom'; import {Input,DatePicker,Form,Col,Butto ...

  3. 服务器部署 halo博客项目

    2020-8-9 13:45:14 有个进阶方法!  如果静态资源加载缓慢如图片,头像  则用CDN加速  (确实很秀!) https://cdn.jsdelivr.net/gh/你的用户名/你的仓库 ...

  4. Docker 查看某一时间段日志

    语法: docker logs [OPTIONS] CONTAINER Options: --details 显示更多的信息 -f, --follow 跟踪实时日志 --since string 显示 ...

  5. 由浇花工具开始IOT物联网平台之开始前言篇【1】

    在2020年时,突然有个想法,就是做个浇花工具,因为平时喜欢养花,有时忘记浇花,有时感觉手动浇花太麻烦,所以做个这个小玩意,是用.NET 开发的WinForm小程序,来控制单片机,带动水泵浇花,还可以 ...

  6. iOS用runtime给一个类动态添加方法 ---class_addMethod

    先介绍下class_addMethod这个fangfa   /**   * Adds a new method to a class with a given name and implementat ...

  7. UE4_C++笔记

    目录 C++ 获取当前世界指针 创建文件夹拾取窗口 获取Actor所在地图名称 选择世界里所有指定类型的Actor 获取当前世界所有已加载关卡 获取当前选择的已加载关卡 获取关卡名称 判断文件/路径是 ...

  8. APP性能测试——首次启动耗时测试

    首次启动耗时: 即第一次安装(清除数据也可以),打开软件,直到进入到首页activity页面,并计算耗时. 示例代码: import os import time # 测试首次启动时间 # 创建App ...

  9. Idea提交文件时,添加不需要提交的文件至.gitignore文件中

    1.在Idea中,依次打开File ---->Setting ---> Editor --->File Types 2.在当前编辑栏下方找到Ignore files and fold ...

  10. 注释中的Unicode编码也会被转义

    现象 public class Unicode { public static void main(String[] args) { // \u000d System.out.println(&quo ...