java类spring加载_spring的加载机制?
1,今天面試官問我spring的加載機(jī)制有哪些---這么"抽象"的問題作為一個十多年經(jīng)驗(yàn)的自己寫過MVC,IOC,ORM, 等各種中間件小框架的開發(fā)人員也回答不出來~
確切的說是無從談起,不知道從哪個角度說這個事情,在我的觀點(diǎn)里這個問題本身的問法就有問題,什么叫"加載機(jī)制",spring加載的是什么????
我很好奇在問別人"spring的加載機(jī)制有哪些"的時候意圖想知道spring是如何被啟動的,還是spring是如何"加載"他管理的組件的;這個問題本身就有很大的歧義~
(我第一反應(yīng)是后者,如果你是問前者,然后告訴我通過什么new XmlApplicationContext("app.xml")或者WebApplicationContext...這種是你的正確答案,我就會覺得你很LOW~
哈哈,當(dāng)然后者其實(shí)也是一個很LOW的面試問題~).
WEB容器"加載"Spring這種說法其實(shí)是不合適的~Spring本身并沒有納入web容器的管理~
用"加載"這個詞來描述Spring"啟動"之后對"被管理組件"的初始化和管理也是非常可笑的說法~
所以其實(shí)你可以忽略這個面試官給你的影響的,很多面試官本身自個兒水平就不咋樣,網(wǎng)上找一些有所謂正確答案的題目...很多時候他們其實(shí)自己都不知道自己在干什么問什么~
2,Spring最核心的東西是什么?盡管現(xiàn)在的spring看起來那么龐雜似乎保羅萬象,但他最核心的東西是容器~
什么是容器?上面有人說容器就是個Map,這句話對也不對,
因?yàn)槿萜鞑粌H僅是存放組件,它最主要的功能是"管理組件的生命周期和依賴".
對象的創(chuàng)建(包括初始化),銷毀....當(dāng)你從容器中g(shù)et一個組件的時候,該組件所依賴的組件也必須相應(yīng)的被初始化(當(dāng)然也有可能是lazy的,只在真正用到的時候);
組件A依賴B和C,C依賴D,D依賴B.....我要得到組件A就需要相應(yīng)的一層層的初始化其他組件,其他組件之間可能存在相互依賴這種情況,這種層層依賴的管理如果人工管理就會非常麻煩~容器能幫助你管理組件,讓這種依賴看起來"扁平"一些~
這是容器核心要解決的問題~
至于其他IOC外圍的功能比如MVC,AOP,集成其他第三方組件,都是次要的~從這一層面而言,Spring容器更像一個粘合劑~各個組件之間的連接和集成的橋梁~
3,有人提到了WEB容器(Tomcat),那就說說WEB容器;
如果你看過tomcat的代碼你就發(fā)現(xiàn),Tomcat本身就是一個容器~他管理著他自身組件的生命周期,你可以看一下tomcat conf目錄下的 "server.xml",他是一個層次結(jié)構(gòu)的包括Server,Connector,Engine,Context Listener 和我們直接關(guān)系的Servlet....
他的作用和spring的applicationContext.xml本質(zhì)上是一樣的~
Tomcat讀取這個XML然后初始化這些組件,跟Spring讀取XML初始化管理自己組件的本質(zhì)其實(shí)是一樣的;
這其實(shí)存在一個問題:他們是兩個容器,對彼此容器內(nèi)的東西沒有控制權(quán),這兩個容器是不兼容的~ @廖雪峰 已經(jīng)說了Tomcat根本不知道你是否使用了Spring,
Tomcat根據(jù)自己的XMLs(包括web.xml)管理自己的組件比如Servlet;Spring根據(jù)自己的applicationContext.xml(s)管理自己的組件~
好些年前我遇到過一個問題:
public class LoginServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
//這里有沒有辦法直接從Spring容器中獲得UserService的實(shí)現(xiàn)呢? @Autowired
UserService userService;
有沒有辦法對Servlet的屬性直接做依賴注入呢?大家思考一下?~
另外一個問題:
有沒有辦法讓Spring來管理我們的Servlet,使得上面的UserService可以注入呢?
注意:我這里說的是容器定義的Servlet~不是什么你自己定義的Action或者Controller;
4,另外我覺得其實(shí)沒有必要"非得"研究JVM或者GC,我是說沒有必要為了面試去研究他們,如果你感興趣,時間允許,沒有任何問題~
否則就會像你說的:看了->用不到->忘了~
至于非得學(xué)什么新的框架~我覺得也沒必要吧;
在我看來學(xué)會"使用"一個框架是很簡單的事情,但學(xué)精任何框架都是很困難的事情~
多看看你現(xiàn)在會的框架,看看他們的代碼知道為什么要那么干,知道他們功能的邊界,什么事情不能干的,有沒有更好的實(shí)現(xiàn)辦法~多知道一些本質(zhì)性的東西,我覺得可能會更好一些~
另外有時間關(guān)注一下新的技術(shù),知道他們是什么能干嗎就沒問題了;
我覺得自己是一個需求驅(qū)動型的~遇到問題有思路就行了~
5,還有,有人說自己實(shí)現(xiàn)一個Spring也是非常簡單的事兒~
按照這個邏輯我是不是也可以說造個核反應(yīng)堆也是一個很簡單事兒?
我只能說你考慮的太少了,很多事情原理很簡單,但實(shí)際上你要遇到的問題遠(yuǎn)比你想象的多~
稍微嚴(yán)謹(jǐn)一點(diǎn)的表述是"自己寫一個類似Spring的玩具IOC容器也比較簡單~"
總結(jié)
以上是生活随笔為你收集整理的java类spring加载_spring的加载机制?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux操作系统字段含义,Linux系
- 下一篇: mysql 分析服务_MySQL分析服务