Spring****源碼分析筆記——bean
開始使用Spring框架后场仲,它的便捷易用色迂,強大初橘,給當年沒有使用任何框架,從頭到尾自己敲Java Web的我來說借卧,簡直到了天堂。
但由于對不能完全自己掌控的感覺的不爽筛峭,特別是在配置一個Spring項目時铐刘,需要各種摸索試錯。
于是影晓,誕生了閱讀Spring源碼镰吵,徹底對它滾瓜爛熟,有問題精準定位挂签,并熟練使用的偉大目標疤祭。。饵婆。勺馆。。侨核。草穆。。
在此搓译,列出幾個優(yōu)點來鼓舞自己堅持下去悲柱,,些己,豌鸡,,段标,涯冠,畢竟,它的源碼怀樟,有8000+文件功偿。盆佣。往堡。械荷。。
1虑灰、從閱讀源碼的過程中吨瞎,體會大神們的各種思想、技巧和編程規(guī)范穆咐。
2颤诀、對源碼和實現(xiàn)方法熟悉了以后,更好地使用对湃。
3崖叫、一個優(yōu)秀成熟的框架,必然有優(yōu)秀先進的技術(shù)拍柒,深入學習Java心傀。
4、看源碼的過程中可復習自己考過就忘的基礎(chǔ)知識點拆讯。
Spring****術(shù)語
EJB (Enterorise JavaBean) 企業(yè)級JavaBean
POJO (Plain Old Java Object) 簡單老式Java對象
DI (Dependency Injection) 依賴注入
AOP (Aspect-Oriented Programming) 面向切面編程
ORM (Object-Relational Mapping) 對象關(guān)系映射
JMS (Java Message Service) Java信息服務(wù)
MVC (Model - View - Controller) 模型-視圖-控制器
Spring基礎(chǔ)知識匯總 Java開發(fā)必看
從一個bean的初始化過程開始
Spring 框架最基礎(chǔ)來說, 是一個 DI(依賴注入) 框架. 我們把我們的程序中用到的實體對象, 也就是我們常說的 bean, 放在 Spring 框架中維護, 當我們用到這些 bean 的時候, 可以在程序的任何地方來獲取.
本文通過從頭到尾跟蹤分析代碼脂男,來查看一個bean的初始化的實現(xiàn)。
定義和注冊 bean
有4種方式定義和注冊bean:
方法一:xml 中來定義 bean 標簽
方法二:通過注解掃描, 比如 @Service 這種類.
方法三:定義 Configuration 類, 在類中提供 @Bean 的方法來定義.
方法四:使用純粹的 programmatically 的方式來定義和注冊.
在代碼中獲取bean的6種方式
方法一:在初始化時保存ApplicationContext對象
方法二:通過Spring提供的utils類獲取ApplicationContext對象
方法三:繼承自抽象類ApplicationObjectSupport
方法四:繼承自抽象類WebApplicationObjectSupport
方法五:實現(xiàn)接口ApplicationContextAware
方法六:通過Spring提供的ContextLoader
本文先分析第一種方式种呐。
在初始化時保存ApplicationContext對象
其中宰翅,userService在xml文件中的定義為:
那么~~開始吧~~~~~
ClassPathXmlApplicationContext****類:
這里為了簡化代碼,只展示了有關(guān)系的代碼爽室,這個類的全部代碼可自己去看~~~
其中汁讼,關(guān)于super關(guān)鍵字的具體了解可點擊查看:java中關(guān)鍵字 super表示的真正對象
<pre style="margin-left:21.0pt;mso-para-margin-left:2.0gd;background:white">可以看到這個類繼承了AbstractXmlApplicationContext類,那么接著看下去肮之。</pre>
AbstractXmlApplicationContext****類(抽象類):
AbstractRefreshableConfigApplicationContext****類(抽象類)
可以看到這個類繼承了AbstractRefreshableApplicationContext類掉缺,并實現(xiàn)了BeanNameAware和InitializingBean接口。
關(guān)于Java中的類和接口的不同戈擒,可點擊閱讀: Java 抽象類眶明、普通類、接口的區(qū)別——值得你一看的干貨 Java抽象類與接口的區(qū)別
其中筐高,Assert.noNullElements搜囱,是使用的Assert類的noNullElements方法,這個方法使用了@Deprecated注解柑土,表示這個方法將被棄用蜀肘,不建議使用。getEnvironment()方法在AbstractApplicationContext類中定義稽屏,會在這個類中詳細分析扮宠。
具體的Spring注解,可點擊查看:Spring常用注解介紹【經(jīng)典總結(jié)】
AbstractRefreshableApplicationContext****類(抽象類)
AbstractApplicationContext****類(抽象類)
終于到了主菜了狐榔,坛增,获雕,,1000+行的代碼收捣,需要從頭到尾慢慢理一理届案。
其中@Override注解,表示該方法是偽代碼,表示重寫(當然不寫也可以)罢艾,不過寫上有如下好處:
1楣颠、可以當注釋用,方便閱讀;
2咐蚯、編譯器可以驗證@Override下面的方法名是否是父類中所有的童漩,如果沒有則報錯。如果沒寫@Override春锋,而下面的方法名又寫錯了睁冬,這時編譯器是可以編譯通過的,因為編譯器以為這個方法是子類中自己增加的方法看疙。Java中@Override的作用
{@link}與@see的簡單使用以及區(qū)別--如何寫好Java代碼注釋豆拨。
為了由繁化簡,還是根據(jù)代碼的執(zhí)行思路來吧~~~
到了AbstractApplicationContext類能庆,終于沒有super(parent)了施禾,改成了如下:
PathMatchingResourcePatternResolver類
PathMatchingResourcePatternResolver可以用來解析資源文件,主要是用來解析類路徑下的資源文件搁胆。當然它也可以用來解析其它資源文件弥搞,如基于文件系統(tǒng)的本地資源文件。PathMatchingResourcePatternResolver在使用時可以直接new一個對象渠旁,new的時候可以通過使用帶ResourceLoader參數(shù)的構(gòu)造方法指定需要使用的ResourceLoader攀例,解析好了資源后獲取資源時需要通過ResourceLoader獲取。
PathMatchingResourcePatternResolver其實也是實現(xiàn)了ResourceLoader接口的顾腊≡撩空的構(gòu)造方法將使用DefaultResourceLoader獲取資源。大多數(shù)時候直接使用其空構(gòu)造函數(shù)即可杂靶。
在AbstractApplicationContext的setParent()方法中梆惯,instanceof 運算符是用來在運行時指出對象是否是特定類的一個實例。通過返回一個布爾值來指出吗垮,這個對象是否是這個特定類或者是它的子類的一個實例垛吗。
因為parent的值為null,所以這里不會運行里面的代碼烁登。
在前面怯屉,有個getEnvironment()函數(shù)的調(diào)用,在AbstractRefreshableConfigApplicationContext類中。下面锨络,分析這個函數(shù)蝗敢。
StandardEnvironment類繼承了AbstractEnvironment類,在AbstractEnvironment類中有resolveRequiredPlaceholders函數(shù):
繼續(xù)跟蹤下去:
這個函數(shù)在AbstractPropertyResolver類中定義:
Java 訪問權(quán)限控制:你真的了解 protected 關(guān)鍵字嗎足删?
SpringBoot環(huán)境屬性占位符解析和類型轉(zhuǎn)換
spring4.1.8擴展實戰(zhàn)之一:自定義環(huán)境變量驗證
未完待續(xù)。锁右。失受。。咏瑟。拂到。。码泞。兄旬。。余寥。领铐。。宋舷。绪撵。。祝蝠。音诈。。绎狭。细溅。。
看Spring源碼真是一個極其漫長的過程啊儡嘶。喇聊。。蹦狂。承疲。。鸥咖。燕鸽。。
參考資料: