1. 程式人生 > >Spring的bean建立順序

Spring的bean建立順序

解答以下疑惑:

  • Spring配置檔案裡bean,究竟是按什麼樣的順序載入呢?
  • Spring專案在部署時,究竟建立了多少各beanFactory呢?按什麼順序建立?

長話短說,總結成如下幾點:

Rule1

首先讀取WEB-INF/web.xml檔案,該檔案內一般會配置spring-configspring-mvc。按順序載入對應的xml檔案。

Rule2

web.xml中還有除springmvc和預設的servlet之外的servlet(如servlet-test),那麼這些servlet會按照定義的順序執行,但一定是在預設servlet之後,springmvc之前執行,並且,若這些servlet都會分別對應一個

ApplicationContext,當然也意味著分別擁有一個beanFactory。這些ApplicationContext(包括springmvc的那個),他們的parent ApplicationContext均是預設servlet對應的那個ApplicationContextRoot ApplicationContext)。預設的servlet,是通過引數contextConfigLocation來指定一個xml檔案。

因此,若springmvc裡的某個Controller嘗試通過auto wire註解來注入servlet-test裡面的service,那麼在執行時會丟擲”Could not autowire field …”異常,因為

springspringmvc那個servlet中的beanFactory(包括其父beanFactory)中找不到對應的bean

Rule3

在載入某個包含beanxml檔案時,按照bean的型別1BeanFactoryPostProcessor類的bean2BeanPostProcessor類的bean3)普通bean,包括import進來的(bean標籤和scan標籤指定的);的順序進行載入。同類型的bean按照定義順序載入。所有bean預設是單例的。

因此,對於BeanFactoryPostProcessorBeanPostProcessor型別的bean,即使被放置在最後面,也會先載入哦。這種設計還是挺人性化的

^_^

Rule4

component-scan生成的bean的預設id是類名(首字母小寫),例如testService1

<bean>標籤生成的bean的預設id:包名.類名#數字,例如qk.spring.beanFactory.service1.TestService1#0

如果component-scanbean標籤生成的bean有衝突(即beanid相同),並且都是單例(預設是單例),那麼不會重複建立,只保留最先創建出來的那個,同一個屬性的話,後續的會覆蓋前面的。

Rule5:

建立BeanFactory時,按照如下順序(beanpostprocessor不會處理beanFactory,雖然他也是個bean)):

見(org.springframework.context.support.AbstractApplicationContext

(見AbstractAutowireCapableBeanFactory#initializeBean(…)。裡面分為AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization(…)AbstractAutowireCapableBeanFactory#postProcessObjectFromFactoryBean(…)

0)建立beanFactory,並儘可能初始化,此時普通bean還未建立;

1)建立spring自己的部分BeanPostProcessor;

2)建立並執行BeanFactoryPostProcessor(包括自定義的)

3)建立並註冊剩餘的內建BeanPostProcessorApplicationContextAwareProcessor(見AbstractApplicationContext#prepareBeanFactory(…)),ServletContextAwareProcessor見(AbstractRefreshableWebApplicationContext#postProcessBeanFactory(…));

4)建立並註冊自定義的BeanPostProcessor(如top代理,config)(AbstractApplicationContext#refresh());

5)建立普通bean(同時應用bean post processor)。


Rule6:單個bean載入過程

按照如下順序:

1)建構函式;

2BeanPostProcessor#postProcessBeforeInitialization(…)

3)設定property

4InitializingBean#afterPropertiesSet();

5BeanPostProcessor#postProcessAfterInitialization(…)

6FactoryBean#getObject()的順序構造bean例項。


這裡是樣例project


相關推薦

@AutoConfigureAfter不生效 @Configration bean的建立順序

  https://gooroo.io/GoorooTHINK/Article/17466/Lessons-Learned-Writing-Spring-Boot-Auto-Configurations/29652#.W_ZwdFUzYdV https://blog.csdn.net/isea5

MFC 程式 手寫建立順序

MFC 程式 手寫建立順序 1.繼承CWinApp類 覆蓋 class CMyApp : public CWinApp { virtual BOOL InitInstance(); } BOOL CMyApp::InitInstance() { CMyFrameWnd *pWnd

軟考:資料結構基礎——建立順序完全二叉樹

  首先是關於樹,二叉樹,完全二叉樹的一些知識 一、樹     (一)、基本概念            1. 度:一個節點的子樹的個數    &

Spring的bean建立順序

解答以下疑惑:Spring配置檔案裡bean,究竟是按什麼樣的順序載入呢?Spring專案在部署時,究竟建立了多少各beanFactory呢?按什麼順序建立?長話短說,總結成如下幾點:Rule1:首先讀取WEB-INF/web.xml檔案,該檔案內一般會配置spring-co

程式設計實現順序表的以下基本操作:建立順序表,修改順序表,插入順序表,刪除順序表。

#include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; typedef int ElemType; typedef int Statu

C語言---動態建立順序表及定義、插入、刪除操作

題目:編寫一個程式,動態的建立一個順序表。要求:順序表的初始長度為10,向順序表中輸入15個整數,並打印出來;再刪除順序表中的第5個元素,打印出刪除後的結果。程式程式碼:#include <stdio.h> #include <stdlib.h> #d

動態建立順序表,並進行插入刪除操作

程式碼程式: #include"stdio.h" #include<iostream> #include"stdlib.h" using namespace std; #define maxsize 10 typedef struct{

oracle建立順序

轉載自:https://tieba.baidu.com/p/2652448891 oracle建立表空間 注意點:1.如果在PL/SQL 等工具裡開啟的話,直接修改下面的程式碼中[斜體加粗部分]執行2.確保路徑存在,比如【D:\oracle\oradata\Oracle9i

java建立順序表及增刪改查功能實現

順序表類的增刪改查功能實現java語言描述package ch01; public class Sqlist { private Object listelem[]; //線性表儲存空間 private int curlen;

建立一個順序佇列,實現佇列的入隊和出隊操作。

標頭檔案: #ifndef seqqueue_H #define seqqueue_H const int queuesize=10; class seqqueue { int rear,front; int data[queuesize]; public: seqqueue(){front

Java建立子類時構造器執行順序

class A { static { System.out.print("1"); } public A() { System.out.print("2"); } } class B extends A{

實驗一:簡單順序表的建立

#include <iostream> using namespace std; class Seqlist { public: Seqlist(){length=0;}//無參構造 Seqlist(int a[], int n);//有參構造 ~Seql

Vue巢狀元件建立和銷燬的順序

       理解生命週期和鉤子函式的呼叫在工程中十分重要,關於Vue生命週期的理解我推薦這一遍詳解Vue生命週期 。寫得真不錯,淺顯易懂,任何初學者一看都能明白是怎麼一回事。今天我當然不是來講生命週期的,我要將的是巢狀元件的建立順序,巢狀

linux下c程式 daemon、fork與建立pthread的順序問題

近期發如今寫linux c服務程式的時候,daemon與執行緒建立之間出現故障。發現程式在daemon之後,起的執行緒就全掛了。 查過一些文件之後,最終知道了why. daemon函式的操作事實上非常easy, 1.fork一個程序,2.處理

try、catch、finally中return的執行順序及自定義異常建立

1.在Java中使用 try/catch語句捕獲異常 說明 throw和throws的區別? 1.作用不同:throw用於程式設計師自行產生並丟擲異常,throws用於宣告該方法內丟擲了異常。 2.使用的位置不同:throw位於方法體內部,可以作為單獨語句使用。throws必須跟在方

按層次順序建立和遍歷二叉樹

第一篇部落格,獻給了資料結構--二叉樹。 最近在學資料結構,總結一下二叉樹的按層次建立的方法,希望對此時的你有所幫助~ 有錯誤的地方,還望大神指出,或者有其他更好的方法,歡迎留言~ /*利用順序佇列,層次建立二叉樹*/ #include <iostream> using name

java由先根中根遍歷序列建立二叉樹,由標明空子樹建立二叉樹,有完全二叉樹順序儲存結構建立二叉鏈式儲存結構

    //由先根和中根遍歷建立二叉樹 public class bitree{     public bitree(String preorder,String inorder,int preindex,int in

順序建立和就地逆置(函式)

本題要求實現順序表的建立和就地逆置操作函式。L是一個順序表,函式ListCreate_Sq(SqList &L)用於建立一個順序表,函式ListReverse_Sq(SqList &L)

資料結構實驗之連結串列一:順序建立連結串列(SDUT 2116)

Problem Description 輸入N個整數,按照輸入的順序建立單鏈表儲存,並遍歷所建立的單鏈表,輸出這些資料。 Input 第一行輸入整數的個數N; 第二行依次輸入每個整數。 Outp

HDU3974(時間戳建成多叉樹)(DFS順序建立線段樹)

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace s