Spring注解源碼分析

我們知道如果想使用spring注解你需要在applicationContext.xml配置文件中設置context:component-scan base-package='xxx’這樣spring會幫助我們掃描你所設置的目錄里面所有的Bean,如果Bean上面有相應的@Service,@Controller注解(當然還有其他的,這里就不一一列出來),那么Spring的IOC容器將會幫我實例對象,設置屬性。

分析spring如果實現注解驅動

還是從spring配置文件的命名空間入手,不清楚的可以參考我之前的文章。找到spring-context包進入文件里面找到src/main/resources/META-INF/spring.handlers這樣你可以看到一下內容:

http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler
http\://www.springframework.org/schema/jee=org.springframework.ejb.config.JeeNamespaceHandler
http\://www.springframework.org/schema/lang=org.springframework.scripting.config.LangNamespaceHandler
http\://www.springframework.org/schema/task=org.springframework.scheduling.config.TaskNamespaceHandler
http\://www.springframework.org/schema/cache=org.springframework.cache.config.CacheNamespaceHandler

可以看到context命名空間解析的類org.springframework.context.config.ContextNamespaceHandler所以可以直接定位到spring掃描的過程。

spring源碼分析-ContextNamespaceHandler

//組件掃描
registerBeanDefinitionParser("component-scan", new ComponentScanBeanDefinitionParser());

整個掃描包路徑的過程如下:

取出自定義base-package路徑

創建ClassPathBeanDefinitionScanner對象并且設置springIOC容器所關心的注解@Component換言之:只要類定義上面有@Component注解那么我們的掃描器就需要處理這個類。

設置BeanName生成工具(這里是生成類名的工具有默認的beanName,也有自定義@Service(“abc”))
開始掃描包,使用ClassReader掃描所有類可以得到類的信息,對比是否有@Component注解,如果有生成BeanDefinition=ScannedGenericBeanDefinition

注冊Spring內置的BeanPostProcessor對象。默認有8個org.springframework.context.annotation.AnnotationConfigUtils#registerAnnotationConfigProcessors(org.springframework.beans.factory.support.BeanDefinitionRegistry, java.lang.Object)主要需要注意的有四個

ConfigurationClassPostProcessor:處理配置類
AutowiredAnnotationBeanPostProcessor:處理@Autowired幫助類注入屬性
RequiredAnnotationBeanPostProcessor:處理@required
CommonAnnotationBeanPostProcessor:處理@Resource幫助類注入屬性

入口代碼:

 if (annotationConfig) {//這里會注冊很多內容BeanPostProcessor類Set<BeanDefinitionHolder> processorDefinitions =AnnotationConfigUtils.registerAnnotationConfigProcessors(readerContext.getRegistry(), source);for (BeanDefinitionHolder processorDefinition : processorDefinitions) {compositeDef.addNestedComponent(new BeanComponentDefinition(processorDefinition));}}

上面只是注冊了所有內置Annotation工具類,還沒有實例化。接下來我們要進入refresh()方法看看基于注解的類實例化過程

注解類實例過程

在前面基于注解的類已經被掃描成為ScannedGenericBeanDefinition現在就要實例化了。再refresh()方法中首先需要注冊前面說的內置處理Annotation類的工具類,沒錯就是這幾個:

2 = "org.springframework.context.annotation.internalConfigurationAnnotationProcessor"
3 = "org.springframework.context.annotation.internalAutowiredAnnotationProcessor"
4 = "org.springframework.context.annotation.internalRequiredAnnotationProcessor"
5 = "org.springframework.context.annotation.internalCommonAnnotationProcessor"
6 = "org.springframework.context.event.internalEventListenerProcessor"
7 = "org.springframework.context.event.internalEventListenerFactory"
//最終這些類變為:
0 = {ApplicationContextAwareProcessor@1792} 
1 = {ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor@1961} 
2 = {PostProcessorRegistrationDelegate$BeanPostProcessorChecker@2193} 
3 = {CommonAnnotationBeanPostProcessor@2135} 
4 = {AutowiredAnnotationBeanPostProcessor@1991} 
5 = {RequiredAnnotationBeanPostProcessor@2107} 
6 = {ApplicationListenerDetector@2194} 

入口在:registerBeanPostProcessors(beanFactory);這里會將上面的類注冊到IOC容器中,然后根據Bean的生命周期中的第6步設置屬性,依據Annotation的方式注入屬性:CommonAnnotationBeanPostProcessor來處理屬性的注入。我們使用了@Resource來配置屬性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249503.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249503.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249503.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux查看和修改PATH環境變量的方法

查看PATH&#xff1a;echo $PATH以添加mongodb server為列修改方法一&#xff1a;export PATH/usr/local/mongodb/bin:$PATH//配置完后可以通過echo $PATH查看配置結果。生效方法&#xff1a;立即生效有效期限&#xff1a;臨時改變&#xff0c;只能在當前的終端窗口中有效&…

GLog 初始化說明

#include <iostream> #include <glog/logging.h>int main(int argc, char* argv[]) {google::InitGoogleLogging(argv[0]);FLAGS_logtostderr false; // 是否將日志輸出到stderr而非文件。FLAGS_alsologtostderr false; //是否將日志輸出到文件和stderr&#xff…

Spring ConfigurationClassPostProcessor Bean解析及自注冊過程

一bean的自注冊過程 二,自注冊過程說明 1 configurationclassparser解析流程 1、處理PropertySources注解&#xff0c;配置信息的解析 2、處理ComponentScan注解&#xff1a;使用ComponentScanAnnotationParser掃描basePackage下的需要解析的類(SpringBootApplication注解也包…

新華社:華爾街專家警告2019年美股或面臨劇烈調整

新華社&#xff1a;華爾街專家警告2019年美股或面臨劇烈調整 2018年08月14日 12:34 新華社新浪財經APP縮小字體放大字體收藏微博微信分享轉載于:https://www.cnblogs.com/hjlweilong/p/9664677.html

java定義注解

小伙伴們。今天我們來說說注解、標志 。針對java不同版本來說&#xff0c;注解的出現是在jdk1.5 但是在jdk1.5版本使用注解必須繼續類的方法的重寫&#xff0c;不能用于實現的接口中的方法實現&#xff0c;在jdk1.6環境下對于繼續和實現都是用。 jdk1.5版本內置了三種標準的注…

2018.09.18 while循環

** "loop" 循環 注意要有引號。 **pass 過 #打印 1-100start 1 while start < 101:print("loop",start)start 1 #打印1-49&#xff0c;81-100. 60-80的平方start 1 while start <101 :if start >49 and start < 60:passelif start >5…

2019第二周作業

基礎作業 實驗代碼 #include<stdlib.h> int main(void) {FILE*fp;int num[4],i,b,max;char op;if((fpfopen("c:\\tmj.txt","r"))NULL){ printf("File open error!\n"); exit(0);}for(i0;i<4;i){fscanf(fp,"%d%c",&nu…

實驗一(高見老師收)

學 號201521450016 中國人民公安大學 Chinese people’ public security university 網絡對抗技術 實驗報告 實驗一 網絡偵查與網絡掃描 學生姓名 陳璪琛 年級 2015 區隊 五 指導教師 高見 信息技術與網絡安全學院 2018年9月18日 實驗任務總綱 2018—2019學年…

GitHub筆記(二)——遠程倉庫的操作

二 遠程倉庫 1 創建聯系 第1步&#xff1a;創建SSH Key。在用戶主目錄下&#xff0c;看看有沒有.ssh目錄&#xff0c;如果有&#xff0c;再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個文件&#xff0c;如果已經有了&#xff0c;可直接跳到下一步。如果沒有&#xff0c;打開S…

QT 子窗體 最大化 界面顯示不對

QT 子窗體 最大化 復原 遇到的問題 項目中有個需求&#xff0c;主窗體中嵌套子窗體&#xff0c;需要將子窗體最大化顯示和復原。 查了很多資料&#xff0c;基本上都是提到&#xff1a;QT中窗口部件QWidget成員函數showFullScreen();是用于將窗口部件全屏顯示&#xff0c;但是他…

Spring 鉤子之BeanFactoryPostProcessor和BeanPostProcessor

BeanFactoryPostProcessor和BeanPostProcessor這兩個接口都是初始化bean時對外暴露的入口之一&#xff0c;和Aware類似&#xff08;PS:關于spring的hook可以看看Spring鉤子方法和鉤子接口的使用詳解講的蠻詳細&#xff09;本文也主要是學習具體的鉤子的細節&#xff0c;以便于實…

什么是HTML DOM對象

HTML DOM 對象 HTML DOM Document 對象 Document 對象 每個載入瀏覽器的 HTML 文檔都會成為 Document 對象。 Document 對象使我們可以從腳本中對 HTML 頁面中的所有元素進行訪問。 提示&#xff1a;Document 對象是 Window 對象的一部分&#xff0c;可通過 window.document 屬…

Python3 matplotlib的繪圖函數subplot()簡介

Python3 matplotlib的繪圖函數subplot()簡介 一、簡介 matplotlib下, 一個 Figure 對象可以包含多個子圖(Axes), 可以使用 subplot() 快速繪制, 其調用形式如下 : subplot(numRows, numCols, plotNum) 圖表的整個繪圖區域被分成 numRows 行和 numCols 列 然后按照從左到右&…

signal(SIGHUP, SIG_IGN);

signal(SIGHUP, SIG_IGN); 的理解轉載于:https://www.cnblogs.com/lanjiangzhou/p/10505653.html

spring鉤子

Spring鉤子方法和鉤子接口的使用詳解 前言 SpringFramework其實具有很高的擴展性&#xff0c;只是很少人喜歡挖掘那些擴展點&#xff0c;而且官方的Refrence也很少提到那些Hook類或Hook接口&#xff0c;至于是不是Spring官方有意為之就不得而知。本文淺析一下筆者目前看到的S…

【bitset 技巧 分塊】bzoj5087: polycomp

神仙zq發現了${n^2\sqrt n}\over 32$做法 Description 你有三個系數為0,1的多項式f(x),g(x),h(x)求f(g(x)) mod h(x)為方便起見&#xff0c;將答案多項式所有系數對2取模輸出即可如果f(x)Sigma(Ak * Xk)則f(g(x))Sigma(Ak(g(x))KInput 一共三行&#xff0c;每行一個多項式,分別…

day 012 生成器 與 列表推導式

生成器的本質就是迭代器&#xff0c;寫法和迭代器不一樣&#xff0c;用法一樣。 獲取方法&#xff1a; 1、通過生成器函數 2、通過各種推導式來實現生成器 3、通過數據的轉換也可以獲取生成器 例如&#xff1a; 更改return 為 yield 即成為生成器 該函數就成為了一個生成器函數…

數據庫設計注意事項和原則

引言數據庫設計是信息系統設計的基礎&#xff0c;一個好的數據庫設計在滿足了軟件需求之外&#xff0c;還要易維護、易擴充等等要求。當然&#xff0c;對專家們反復強調的數據的一致性、冗余性、訪問效率等問題的解決&#xff0c;很大程度上取決于數據庫設計者的經驗和專業水平…

【AtCoder】ARC078

C - Splitting Pile 枚舉從哪里開始分的即可 #include <bits/stdc.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar( ) #define enter putchar(\n) #define MAXN 200005 #defi…

20172325 2018-2019-1 《Java程序設計》第二周學習總結

20172325 2018-2019-1 《Java程序設計》第二周學習總結 教材學習內容總結 3.1集合 集合是一種聚集、組織了其他對象的對象。集合可以分為兩大類&#xff1a;線性集合和非線性集合。線性集合&#xff1a;一種其元素按照直線方式組織的集合。非線性集合&#xff1a;一種其元素按某…