1. 程式人生 > >IOC容器從BeanFactory獲取Bean原始碼淺析

IOC容器從BeanFactory獲取Bean原始碼淺析

我們經常說IOC容器,它具體由誰來充當這個角色呢,我的理解ApplicationContext是用來管理IOC容器中的Bean的,IOC容器本質上是由DefaultListableBeanFactory擔當的。


我們想從容器中獲得某個Bean,是通過ApplicationContext來獲取的,實際實現是從容器DefaultListableBeanFactory取的,比如下面這樣:

public class BeanExample {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");//建立bean
        UserService userService = (UserService) applicationContext.getBean("userService");//獲取bean
        userService.hello("haha");
    }
}
<bean id="userService" class="com.hand.user.dal.UserServiceImpl" scope="prototype"/> <!--指定例項化型別為原型-->
<bean id="studentService" class="com.hand.user.dal.StudentServiceImpl"/>  <!--預設是單例-->


先看看beans.xml中定義的bean是如何例項化到Ioc容器中的。



這個過程是,把beans.xml轉換為io流,通過io流來讀取解析<bean>標籤。將所有解析到的BeanDifinition載入到DefaultListableBeanFactory中快取起來。最後在獲取Bean時,根據BeanDifinition將Bean例項化到Ioc容器。











這裡我們獲取的是原型Bean,看下它怎麼取的。






說明幾個概念:

ListableBeanFactory:可列表Bean工廠,是所有bean的集合(IOC容器)。

HierarchicalBeanFactory:有繼承關係的Bean工廠,定義bean之間的關係。

AutowireCapableBeanFactory:自動裝配Bean工廠,定義bean的行為,比如:裝配Bean,解決bean之間的依賴。

預設的單例Bean,在容器初始化時,就例項化到快取中了,只例項化一次,多次共享。

原型Bean,是在每次請求時,才例項化,所以有多個例項,是獨立的。

相關推薦

IOC容器BeanFactory獲取Bean原始碼淺析

我們經常說IOC容器,它具體由誰來充當這個角色呢,我的理解ApplicationContext是用來管理IOC容器中的Bean的,IOC容器本質上是由DefaultListableBeanFactory擔當的。我們想從容器中獲得某個Bean,是通過ApplicationCon

Spring獲取Bean 原始碼淺析

今天開門見山,直接亮程式碼~ MyTestBean bean = (MyTestBean)bf.getBean("myTestBean")我想上面這行程式碼,第一次接觸過spring這個框架時都應該接觸過;讀取xml中我們配置的bean; spring分為7大部分組成,

Spring原始碼FactoryBean獲取Bean的例項

主程式碼 詳細分析 主程式碼 類AbstractBeanFactory protected <T> T doGetBean(......){

4. IOC容器的依賴注入(原始碼解讀)

一、基本概念 1.當Spring IoC容器完成了Bean定義資源的定位、載入和解析註冊以後,IoC容器中已經管理類Bean定義的相關資料,但是此時IoC容器還沒有對所管理的Bean進行依賴注入,依賴注入在以下兩種情況發生: (1)使用者第一次通過getBean

Spring揭祕-Spring的IoC容器BeanFactory

1.Spring容器的介紹 Spring的IoC容器是一個IoC Service Provider,但是,這只是它被冠以IoC之名的部分原因,我們不能忽略的是”容器”。Spring的IoC容器是一個提供IoC支援的輕量級容器,除了提供基本的IoC支援,它作為輕

Spring原始碼解析-getBean如何獲取Ioc容器中的bean

在Spring框架中,主要是要IOC容器和AOP切面兩塊,然而從IOC容器中如何獲取bean也對我們而言也是可以來學習解析的。 一、解讀getBean的背景   在工作中,一次通過從IOC容器中獲取通過繼承FactoryBean介面的類,發現在對

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

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

Spring的IOC容器原始碼學習----Bean的定位,載入,解析,註冊,注入

目錄 IOC容器系列包含BeanFactory和ApplicationContext,這兩個介面就是IOC的具體表現形式。 他們的介面關係設計圖如下所示: 主要介面設計主線:    1.BeanFactory -> Hierarc

spring深入學習(十五) IOC單例快取中獲取單例 bean

從這篇部落格開始我們開始載入 bean 的第一個步驟,從快取中獲取 bean,程式碼片段如下: Object sharedInstance = getSingleton(beanName); if (sharedInstance != null &&

Spring IOC容器啟動流程原始碼解析(四)——初始化單例項bean階段

目錄 1. 引言 2. 初始化bean的入口 3 嘗試從當前容器及其父容器的快取中獲取bean 3.1 獲取真正的beanName 3.2 嘗試從當前容器的快取中獲取bean 3.3 從父容器中查詢bean 3.4 解析bean的依賴 3.5 再一

獲取IOC容器中的bean的兩種方式(id和class)的區別

// ClassPathXmlApplicationContext: 是 ApplicationContext的實現類,從類路徑下來載入配置檔案 ApplicationContext ctx=new ClassPathXmlApplicationContext("a

Spring原始碼深度解析-3、XmlBeanFactory到程式設計式使用IOC容器

XmlBeanFactory簡述 XmlBeanFactory繼承自DefaultListableBeanFactory,因此他擁有一個IOC容器最基本的功能,包括getBean,getBeanDefinationsName,除此之外,通過這個容器的名稱也能瞭解到這個容器是可以讀取以Xm

springboot 普通類獲取spring IOC容器中的Bean

我們知道如果我們要在一個類使用spring提供的bean物件,我們需要把這個類注入到spring容器中,交給spring容器進行管理,但是在實際當中,我們往往會碰到在一個普通的Java類中,想直接使用spring提供的其他物件或者說有一些不需要交給spring管理,但是需

Spring IOC容器bean初始化原始碼分析

上一篇分析對bean定義的解析原始碼進行了分析,這個過程的最終結果是把xml檔案中bean的定義解析成一個個的BeanDefinition物件並且註冊到容器中,在Spring IOC容器啟動簡介篇中分析,在容器啟動的最後會對容器中的所有bean進行初始化,利用之前解析出的B

【Spring原始碼--IOC容器的實現】(六)Bean的依賴注入

程式碼1.:8:BeanWrapperImpl類的setPropertyValue方法: @SuppressWarnings("unchecked") private void setPropertyValue(PropertyTokenHolder tokens, PropertyValue pv) t

Spring框架—— IOC容器Bean的配置

單引號 framework 將不 配置信息 init 字符串連接 生命 release exp 1 IOC和DI ①IOC(Inversion of Control):反轉控制。 在應用程序中的組件需要獲取資源時,傳統的方式是組件主動的從容器中獲取所需要的資源,在這樣的模

Spring中IOC容器對數組,集合的相關bean的裝配

art prop emp pri val 對數 try ioc容器 blog <bean id="department" class="com.pojo.Department"> <property name="name" val

Spring IOC 容器源碼分析 - 創建單例 bean 的過程

event version trac 方法 del lB ctu prepare 先來 1. 簡介 在上一篇文章中,我比較詳細的分析了獲取 bean 的方法,也就是getBean(String)的實現邏輯。對於已實例化好的單例 bean,getBean(String) 方法

Spring IOC 容器源碼分析 - 創建原始 bean 對象

設置 assign 循環 處理器 from index boolean sar 興趣 1. 簡介 本篇文章是上一篇文章(創建單例 bean 的過程)的延續。在上一篇文章中,我們從戰略層面上領略了doCreateBean方法的全過程。本篇文章,我們就從戰術的層面上,詳細分析d

Spring IOC 容器源碼分析 - 填充屬性到 bean 原始對象

interface let 源碼分析 添加 eat object determine 方法調用 集合類 1. 簡介 本篇文章,我們來一起了解一下 Spring 是如何將配置文件中的屬性值填充到 bean 對象中的。我在前面幾篇文章中介紹過 Spring 創建 bean 的流