1. 程式人生 > >Spring原始碼學習之BeanFactory和FactoryBean

Spring原始碼學習之BeanFactory和FactoryBean

今天在學習Spring原始碼的時候,發現了spring中不僅僅有BeanFactory,還有FactoryBean,突然覺得分不清這兩者之間有什麼不同,難道僅僅是名字嗎?但是從名字上我們也能看出一些端倪:BeanFactory是bean的工廠,而FactoryBean顯然是屬於bean的一種,其他的就不得而知了。然後查了一些資料,知道了一下內容。

BeanFacotry是一個Bean工廠(類工廠),使用它來建立各種型別的Bean,最主要的方法就是getBean(String beanName),該方法從已經完成初始化的IoC容器中返回指定名稱的Bean,只不過其中有一種Bean是FacotryBean

一個Bean 要想成為FacotryBean,必須實現FactoryBean 這個介面。

FactoryBean定義了三個介面方法:

    1)Object getObject():返回由FactoryBean建立的Bean的例項,如果isSingleton()方法返回true,是單例的例項,該例項將放入Spring的緩衝池中;

    2)boolean isSingleton():確定由FactoryBean建立的Bean的作用域是singleton還是prototype;

    3)getObjectType():返回FactoryBean建立的Bean的型別。

FactoryBean 是一直特殊的bean,它實際上也是一個工廠,我們在通過FactoryBeanName得到的Bean,是FacotryBean建立的Bean,即它通過getObject()建立的Bean。我們要想得到FactoryBean本身,必須通過&FactoryBeanName得到,即在BeanFactory中通過getBean(&FactoryBeanName)來得到 FactoryBean。

注:在spring 中是通過BeanFactoryUtils.isFactoryDereference()來判斷一個Bean是否是FactoryBean。spring 內部實現中應該是在通過BeanFacotry 的getBean(String beanName) 來得到Bean時,如果這個Bean是一個FactoryBean,則把它生成的Bean返回,否者直接返回Bean。

相關推薦

Spring原始碼學習BeanFactoryFactoryBean

今天在學習Spring原始碼的時候,發現了spring中不僅僅有BeanFactory,還有FactoryBean,突然覺得分不清這兩者之間有什麼不同,難道僅僅是名字嗎?但是從名字上我們也能看出一些端

Spring原始碼學習BeanFactory體系結構

public interface AutowireCapableBeanFactory extends BeanFactory { /** * Constant that indicates no externally defined autowiring. Note that

Spring原始碼解讀】BeanFactoryFactoryBean區別及類裝載原始碼解讀

最近讀程式碼讀到Bean裝載過程,順帶上網搜了下BeanFactory和FactoryBean,發現好多文章都講的不清不楚,特此自己來整理了一份BeanFactory和FactoryBean的區別及講下bean的裝載和讀取過程的原始碼.     首先來

Spring原始碼學習BeanFactory介面簡述

BeanFactory介面中定義如下: BeanFactory.class介面中定義的只是一下介面,通過實現這一系列介面,可以使用不同的bean的檢索方法(獲取不同的bean),很方便的從ioc容器中獲取需要的bean,從而忽略ioc的具體實現。 下面大致介紹一下這幾個介

spring原始碼學習路---IOC容器初始化要義bean定義載入(四)

上章說到要帶各位去看看bean定義載入的要義,其實就是loadBeanDefinitions這個方法的具體實現步驟,下面我們跟隨這個方法去看下它到底是如何載入bean定義的。 上面是我擷取的實現了loadBeanDefinitions的類級別截圖,loadBeanDefinit

spring原始碼學習路---深度分析IOC容器初始化過程(三)

分析FileSystemXmlApplicationContext的建構函式,到底都做了什麼,導致IOC容器初始化成功。 public FileSystemXmlApplicationContext(String[] configLocations, boolean ref

spring原始碼學習路---IOC實現原理(二)

上一章我們已經初步認識了BeanFactory和BeanDefinition,一個是IOC的核心工廠介面,一個是IOC的bean定義介面,上章提到說我們無法讓BeanFactory持有一個Map package org.springframework.beans.factory.supp

spring原始碼學習路---IOC初探(一)

首先把spring原始碼匯入,怎麼匯入百度下。 首先我們來說一下IOC,IOC是spring最核心的理念,包括AOP也要屈居第二,那麼IOC到底是什麼呢,四個字,控制反轉。 網上有不少是這麼解釋IOC的,說IOC是將物件的建立和依賴關係交給容器,這句話我相信不少人都知道,在我個人的理解

Spring Boot學習LogbackLog4j2整合與日誌發展史

一、簡介 Java知名的日誌有很多,比如:JUL、Log4j、JCL、SLF4J、Logback、Log4j2,那麼這些日誌框架之間有著怎樣的關係?誕生的原因又是解決什麼問題?下面一起來看。 1.1 JUL Java有自己的日誌框架JUL(Java Util Logging)在java.

Spring原始碼學習容器的功能擴充套件

我們都站在巨人的肩膀上 宣告:參考《Spring原始碼深度解析》 ApplicationContext和BeanFactory區別: Application提供了更多的擴充套件功能,簡單來說,就是:Application包含了BeanFactory的所

SPRING原始碼學習路(一)

結合《Spring技術內幕:深入解析SPRING架構與設計原理》這本書開啟Spring學習之路。 ps:之前其實已經看過一部分了,但是也就是看過,一看而過了。o(╯□╰)o 結合FileSystemXmlApplicationContext來分析  具體實現如下: /

Spring原始碼學習IOC實現原理(二)-ApplicationContext

一.Spring核心元件結構      總的來說Spring共有三個核心元件,分別為Core,Context,Bean.三大核心元件的協同工作主要表現在 :Bean是包裝我們應用程式自定義物件Object的,Object中存有資料,而Context就是為了這些資料存放提供一個生存環境,儲存各個 bean之間的

Spring原始碼學習IOC容器實現原理(一)-DefaultListableBeanFactory

從這個繼承體系結構圖來看,我們可以發現DefaultListableBeanFactory是第一個非抽象類,非介面類。實際IOC容器。所以這篇部落格以DefaultListableBeanFactoryIOC容器為基準進行IOC原理解析。 一.兩個重要介面 前面已經分析了BeanFactor,它的三個直接子

Spring原始碼學習AOP

我們都站在巨人的肩膀上 宣告:參考《spring原始碼深度解析》 1.Spring AOP主要採用動態代理實現,而動態代理分為兩種: JDK動態代理:其代理物件必須是某個介面的實現,它是通過在執行時期建立一個介面的實現類來完成對目標物件的代理。 CG

Spring原始碼學習路---深入AOP(終)

原文地址:https://blog.csdn.net/zuoxiaolong8810/article/details/8962353    上一章和各位一起看了一下springAOP的工作流程,當我們給出AOP相關的配置以後,直接從IOC容器中拿出來的就是已經加強過的bean

SPRING原始碼學習路(二)

     上一篇,已經對IOC容器的初始化過程有個大體認識,接著看IOC容器的依賴注入。       依賴注入的觸發是在使用者第一次向容器索要Bean時才觸發,當然也可以設定lazy-init讓容器提前完成Bean的預例項化,預例項化是在初始化過程中完成      我

ExtJs原始碼學習namespaceurlEncode

[size=medium] 真的很慚愧,花了一個半小時才讀完兩個函式, 虧得我還是挑了較簡單的來看。有兩個原因。第一個肯定是自己的基礎不紮實。說實話,我的js功底的確不怎麼好, 只知道用一些常用的函式來實現一些普通的功能。對於那些自己不怎麼用的函式看都不想看一下。讀了幾

Spring Boot 學習快取 NoSQL 篇(四)

該系列並非完全原創,官方文件、作者一、前言當系統的訪問量增大時,相應的資料庫的效能就逐漸下降。但是,大多數請求都是在重複的獲取相同的資料,如果使用快取,將結果資料放入其中可以很大程度上減輕資料庫的負擔,提升系統的響應速度。本篇將介紹 Spring Boot 中快取和 NoSQ

Spring原始碼學習路---IOC實現原理(三)

原文地址:https://blog.csdn.net/zuoxiaolong8810/article/details/8548478          上一章我們已經初步認識了BeanFactory和BeanDefinition,一個是IOC的核心工廠介面,一個是IOC的be

spring原始碼學習六 元素處理過程

概述: </property-placeholder> 主要用來讀取配置資訊替換Bean中的${}佔位符, 常用配置如下: <context:property-placeholder ignore-resource-not-found="