FactoryBean和BeanFactory两只是两个单词顺序不同但是内容大不相同。落脚点在后面一个单词,前面一个单词是其功能描述:FactoryBean——工厂bean,一个建工厂的bean?BeanFactory——bean工厂,一个生产bean的工厂。初识比较拗口像最开始接触函数指针与指针函数一样。

  Sring对外提供接口XXXApplicationContext的继承UML图,可以看到BeanFactory是容器的顶级接口,具体使用是其某个子类。本文不详述BeanFactory,在前面文章中有介绍其子类使用Spring Bean加载全过程(注解配置) - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)

    

    

  下面重点介绍FactoryBean:Spring中Bean有两种,⼀种是普通Bean,⼀种是⼯⼚Bean(FactoryBean), FactoryBean可以⽣成某⼀个类型的Bean实例(返回给我们),也就是说我们可以借助于它⾃定义Bean的创建过程。

  Bean创建的三种⽅式中的静态⽅法和实例化⽅法和FactoryBean作⽤类似, FactoryBean使⽤较多,尤其在Spring框架⼀些组件中会使⽤,还有其他框架和Spring框架整合时使⽤。

    

  那么getBean时Spring如何判断要获取的这个bean对象使用用户自定义的FactoryBean构造呢?

  通过跟踪源码可以找到处理逻辑:判断beandefinition是否FactoryBean,如果是则从工厂bean中获取对象。

   

  其中从工厂bean获取对象时,判断是否有引用,可以获得构造对象的工厂bean对象:

    

  测试案例如下:

    bean:

     

    factorybean:

      

    配置类:

      

    测试类:

      

    对于&的有误,差别还是比较大的,如上源码分析——有&表示获取工厂bean,无表示通过工厂bean获取被构造的对象bean:

      

    

    

Spring高级特性之四:FactoryBean和BeanFactory的更多相关文章

  1. Spring 高级特性之二:Processor——Bean生命周期关键触发时机

    任何对象都有生命周期,那么Spring Bean对象创建.管理.销毁的整个生命周期个关键触发时机如何体现呢?先说结论,后续案例验证结论. 根据上图可知,实际bean对象涉及生命周期的主要是一个构造器和 ...

  2. Spring高级特性之一: Aware之ApplicationContextAware

    关于Spring Aware之前似乎涉及过,但是未写过单独的小作文.这里为它专门写个小作文吧,关于它在自定义注解中的应用. 首先,概要介绍下Aware. Spring的依赖注入的最大亮点就是你所有的B ...

  3. Spring高级特性之三:@Enable*注解的工作原理

    Spring Boot中阐述热插拔技术的时候,简单地提及@Enable*注解.随着多种框架的应用及深入了解,@Enable*这个注解在各种框架中应用相当普及. 那么@Enable*注解工作原理是怎么样 ...

  4. Spring框架学习[IoC容器高级特性]

    1.通过前面4篇文章对Spring IoC容器的源码分析,我们已经基本上了解了Spring IoC容器对Bean定义资源的定位.读入和解析过程,同时也清楚了当用户通过getBean方法向IoC容器获取 ...

  5. 嗨,你知道吗,Spring还有这些高级特性!

    目录 Spring介绍 设计理念 核心组件的协同工作 设计模式的应用 代理模式 策略模式 特性应用 事件驱动编程 异步执行 定时任务 日常开发使用非常多的Spring,它的设计理念是什么呢?有哪些核心 ...

  6. Spring FactoryBean和BeanFactory 区别

    1 BeanFactory 是ioc容器的底层实现接口,是ApplicationContext 顶级接口 spring不允许我们直接操作 BeanFactory  bean工厂,所以为我们提供了App ...

  7. Spring 的微内核与FactoryBean扩展机制--转载

    作者:江南白衣 原文地址: http://www.blogjava.net/calvin/archive/2005/08/30/11099.html http://www.blogjava.net/c ...

  8. sping IOC的设计原理和高级特性

    1. IOC 是Spring的内核,字面意思是控制反转,并提出了DI依赖注入的概念. 2.Spirng 容器的设计中,一个是实现BeanFactory 接口的简单饿汉容器,另外一个是比较高级的Appl ...

  9. Spring拓展接口之FactoryBean,我们来看看其源码实现

    前言 开心一刻 那年去相亲,地点在饭店里,威特先上了两杯水,男方绅士的喝了一口,咧嘴咋舌轻放桌面,手抚额头闭眼一脸陶醉,白水硬是喝出了82年拉菲的感觉.如此有生活情调的幽默男人,果断拿下,相处后却发现 ...

随机推荐

  1. [BZOJ2761] [JLOI2011] 不重复数字 (C++ STL - set)

    不重复数字 题目:         给出N个数,要求把其中重复的去掉,只保留第一次出现的数.例如,给出的数 为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 1 ...

  2. Redis可视化内存分析工具--RDR:查看Redis中key的占用情况

    RDR(redis datareveal)是一个解析redis rdbfile的工具.与redis-rdb-tools 相比,RDR 是由 golang 实现的,速度要快得多(5GB rdbfile ...

  3. Ubuntu下使用VS Code创建Spring Boot工程

    目的 我们将在Ubuntu桌面系统下,使用VS Code(Visual Studio Code)编辑器从零开始创建一个Spring Boot工程,并实现一个简单的RESTful风格接口.使用这套流程的 ...

  4. 《手把手教你》系列技巧篇(五十九)-java+ selenium自动化测试 - 截图三剑客 -上篇(详细教程)

    1.简介 今天本来是要介绍远程测试的相关内容的,但是宏哥在操作服务器的时候干了件糊涂的事,事情经过是这样的:本来申请好的Windows服务器用来做演示的,可是服务器可能是局域网的,连百度都不能访问,宏 ...

  5. azure flask 测试

    本机 flask on linux service 完美.选择部署槽 web app service

  6. gorm中动态使用表名

    用户表(前台.后台) type User struct { ID int `gorm:"primaryKey;autoIncrement"` Name sql.NullString ...

  7. 直接copy大于某一个时间小于某一个时间的文件--find进阶用法

    find ./ -type f -newermt '2000-01-04 10:30:00' ! -newermt '2019-10-28 10:57:00' -exec cp -a {} /var/ ...

  8. python 求模运算符--判断奇偶数

    #!/usr/bin/python #coding=utf-8 #好好学习,天天向上 number = input("please enter a number:") number ...

  9. python网络爬虫-静态网页抓取(四)

    静态网页抓取 在网站设计中,纯HTML格式的网页通常被称之为静态网页,在网络爬虫中静态网页的数据比较容易抓取,因为说有的数据都呈现在网页的HTML代码中.相对而言使用Ajax动态加载的玩个的数据不一定 ...

  10. IDEA导入建立图标类型的包失败

    开发安卓app时当我导入下面的包时,显示包名变红,并且包不可用,这可能与你建立的项目类型有关. MPAndroidChart包是建立图标类型的包,需要自己下载并添加进libs目录 解决方案是在libs ...