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. 3. Tooltip 工具提示

    1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta charset="U ...

  2. Oracle 临时表空间暴满的原因与解决方法

    Oracle临时表空间主要用来做查询和存放一些缓冲区数据.临时表空间消耗的主要原因是需要对查询的中间结果进行排序. 重启数据库可以释放临时表空间,如果不能重启实例,而一直保持问题sql语句的执行,te ...

  3. linux 设置开机自动挂载文件系统

    一./etc/ 下增加rc.local文件(ubuntu默认没有这个文件) kuaibang@face:~$ sudo touch rc.local 二.安装NFS客户端 a.如果您使用CentOS. ...

  4. HCIP-ICT实战进阶04-ISIS原理与配置

    HCIP-ICT实战进阶04-ISIS原理与配置 0 前言 IS-IS(Intermediate System to Intermediate System, 中间系统到中间系统)协议, 和OSPF一 ...

  5. CCF 202012-1 期末预测之安全指数

    #include <iostream> //#include <bits/stdc++.h> #include <string> using namespace s ...

  6. 使用C++进行冒泡排序

    #include "pch.h" #include <iostream> using namespace std;手动输入10个数,进行冒泡排序 int main() ...

  7. Leetcode——二分法bisect_left,bisect_right

    !前提--列表有序 case 1 如果列表中没有元素x,那么bisect_left(ls, x)和bisec_right(ls, x)返回相同的值,该值是x在ls中"合适的插入点索引,使得数 ...

  8. 【逆向】使用IDA Python脚本自动化解密字符串数据

    前言 一个肚脑虫(Donot)APT组织的下载器样本,样本中的一些关键字符串数据需要使用指定函数进行动态解密.所以正好借此机会记录下怎么使用IDA Python脚本来解密字符串数据.使用IDA Pyt ...

  9. go两种数据类型的区别、数据类型和操作符、常量、变量声明

    值类型和引用类型 1.值类型:变量直接存储值,内存通常在栈中分配. 基本数据类型int.float.bool.string以及数组和struct. 2.引用类型:变量存储的是一个地址,这个地址存储最终 ...

  10. defer、panic、recover

    defer(延迟执行语句) 多个延迟执行语句的处理顺序 package main import ( "fmt" ) func main() { fmt.Println(" ...