Spring的bean建立順序
解答以下疑惑:
- Spring配置檔案裡bean,究竟是按什麼樣的順序載入呢?
- Spring專案在部署時,究竟建立了多少各beanFactory呢?按什麼順序建立?
長話短說,總結成如下幾點:
Rule1:
首先讀取WEB-INF/web.xml檔案,該檔案內一般會配置spring-config和spring-mvc。按順序載入對應的xml檔案。
Rule2:
若web.xml中還有除springmvc和預設的servlet之外的servlet(如servlet-test),那麼這些servlet會按照定義的順序執行,但一定是在預設servlet之後,springmvc之前執行,並且,若這些servlet都會分別對應一個
因此,若springmvc裡的某個Controller嘗試通過auto wire註解來注入servlet-test裡面的service,那麼在執行時會丟擲”Could not autowire field …”異常,因為
Rule3:
在載入某個包含bean的xml檔案時,按照bean的型別1)BeanFactoryPostProcessor類的bean;2)BeanPostProcessor類的bean;3)普通bean,包括import進來的(bean標籤和scan標籤指定的);的順序進行載入。同類型的bean按照定義順序載入。所有bean預設是單例的。
因此,對於BeanFactoryPostProcessor和BeanPostProcessor型別的bean,即使被放置在最後面,也會先載入哦。這種設計還是挺人性化的
Rule4:
component-scan生成的bean的預設id是類名(首字母小寫),例如testService1。
<bean>標籤生成的bean的預設id是:包名.類名#數字,例如qk.spring.beanFactory.service1.TestService1#0
如果component-scan和bean標籤生成的bean有衝突(即bean的id相同),並且都是單例(預設是單例),那麼不會重複建立,只保留最先創建出來的那個,同一個屬性的話,後續的會覆蓋前面的。
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)建立並註冊剩餘的內建BeanPostProcessor,ApplicationContextAwareProcessor(見AbstractApplicationContext#prepareBeanFactory(…)),ServletContextAwareProcessor見(AbstractRefreshableWebApplicationContext#postProcessBeanFactory(…));
4)建立並註冊自定義的BeanPostProcessor(如top代理,config)(AbstractApplicationContext#refresh());
5)建立普通bean(同時應用bean post processor)。
Rule6:單個bean載入過程
按照如下順序:
1)建構函式;
2)BeanPostProcessor#postProcessBeforeInitialization(…);
3)設定property;
4)InitializingBean#afterPropertiesSet();
5)BeanPostProcessor#postProcessAfterInitialization(…);
6)FactoryBean#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