Spring容器高層視圖 Spring 啟動(dòng)時(shí)讀取應(yīng)用程序提供的Bean配置信息,并在Spring容器中生成一份相應(yīng)的Bean配置注冊表,,然后根據(jù)這張注冊表實(shí)例化Bean,,裝配好Bean之間的依賴關(guān)系,為上層應(yīng)用提供準(zhǔn)備就緒的運(yùn)行環(huán)境,。 Bean緩存池:HashMap實(shí)現(xiàn) IOC容器介紹 Spring 通過一個(gè)配置文件描述 Bean 及 Bean 之間的依賴關(guān)系,,利用 Java 語言的反射功能實(shí)例化 Bean 并建立 Bean 之間的依賴關(guān)系。 Spring 的 IoC 容器在完成這些底層工作的基礎(chǔ)上,,還提供了 Bean 實(shí)例緩存,、生命周期管理、 Bean 實(shí)例代理、事件發(fā)布,、資源裝載等高級服務(wù),。 BeanFactory 是 Spring 框架的基礎(chǔ)設(shè)施,面向 Spring 本身,; ApplicationContext 面向使用 Spring 框架的開發(fā)者,,幾乎所有的應(yīng)用場合我們都直接使用 ApplicationContext 而非底層的 BeanFactory。
BeanFactory BeanFactory體系架構(gòu): BeanDefinitionRegistry: Spring 配置文件中每一個(gè)節(jié)點(diǎn)元素在 Spring 容器里都通過一個(gè) BeanDefinition 對象表示,,它描述了 Bean 的配置信息,。而 BeanDefinitionRegistry 接口提供了向容器手工注冊 BeanDefinition 對象的方法。 BeanFactory 接口位于類結(jié)構(gòu)樹的頂端 ,,它最主要的方法就是 getBean(String beanName),,該方法從容器中返回特定名稱的 Bean,BeanFactory 的功能通過其他的接口得到不斷擴(kuò)展:
ListableBeanFactory:該接口定義了訪問容器中 Bean 基本信息的若干方法,,如查看Bean 的個(gè)數(shù),、獲取某一類型 Bean 的配置名、查看容器中是否包括某一 Bean 等方法,; HierarchicalBeanFactory:父子級聯(lián) IoC 容器的接口,,子容器可以通過接口方法訪問父容器; 通過 HierarchicalBeanFactory 接口,, Spring 的 IoC 容器可以建立父子層級關(guān)聯(lián)的容器體系,,子容器可以訪問父容器中的 Bean,但父容器不能訪問子容器的 Bean,。Spring 使用父子容器實(shí)現(xiàn)了很多功能,,比如在 Spring MVC 中,展現(xiàn)層 Bean 位于一個(gè)子容器中,,而業(yè)務(wù)層和持久層的 Bean 位于父容器中,。這樣,展現(xiàn)層 Bean 就可以引用業(yè)務(wù)層和持久層的 Bean,,而業(yè)務(wù)層和持久層的 Bean 則看不到展現(xiàn)層的 Bean,。 ConfigurableBeanFactory:是一個(gè)重要的接口,增強(qiáng)了 IoC 容器的可定制性,,它定義了設(shè)置類裝載器,、屬性編輯器、容器初始化后置處理器等方法,; AutowireCapableBeanFactory:定義了將容器中的 Bean 按某種規(guī)則(如按名字匹配,、按類型匹配等)進(jìn)行自動(dòng)裝配的方法,; SingletonBeanRegistry:定義了允許在運(yùn)行期間向容器注冊單實(shí)例 Bean 的方法,;
例子: 使用 Spring 配置文件為 Car 提供配置信息:beans.xml: 通過 BeanFactory 裝載配置文件,啟動(dòng) Spring IoC 容器: XmlBeanFactory 通過 Resource 裝載 Spring 配置信息并啟動(dòng) IoC 容器,然后就可以通過 BeanFactory#getBean(beanName)方法從 IoC 容器中獲取 Bean 了,。通過 BeanFactory 啟動(dòng)IoC 容器時(shí),,并不會(huì)初始化配置文件中定義的 Bean,初始化動(dòng)作發(fā)生在第一個(gè)調(diào)用時(shí),。 對于單實(shí)例( singleton)的 Bean 來說,,BeanFactory會(huì)緩存 Bean 實(shí)例,所以第二次使用 getBean() 獲取 Bean 時(shí)將直接從 IoC 容器的緩存中獲取 Bean 實(shí)例,。Spring 在 DefaultSingletonBeanRegistry 類中提供了一個(gè)用于緩存單實(shí)例 Bean 的緩存器,,它是一個(gè)用HashMap 實(shí)現(xiàn)的緩存器,單實(shí)例的 Bean 以 beanName 為鍵保存在這個(gè)HashMap 中,。 值得一提的是,,在初始化 BeanFactory 時(shí),必須為其提供一種日志框架,,比如使用Log4J,, 即在類路徑下提供 Log4J 配置文件,這樣啟動(dòng) Spring 容器才不會(huì)報(bào)錯(cuò),。
ApplicationContext ApplicationContext 由 BeanFactory 派生而來,,提供了更多面向?qū)嶋H應(yīng)用的功能。 在BeanFactory 中,,很多功能需要以編程的方式實(shí)現(xiàn),,而在 ApplicationContext 中則可以通過配置的方式實(shí)現(xiàn)。 ApplicationContext 繼承了 HierarchicalBeanFactory 和 ListableBeanFactory 接口,,在此基礎(chǔ)上,,還通過多個(gè)其他的接口擴(kuò)展了 BeanFactory 的功能: ClassPathXmlApplicationContext:默認(rèn)從類路徑加載配置文件 FileSystemXmlApplicationContext:默認(rèn)從文件系統(tǒng)中裝載配置文件 ApplicationEventPublisher:讓容器擁有發(fā)布應(yīng)用上下文事件的功能,包括容器啟動(dòng)事件,、關(guān)閉事件等,。實(shí)現(xiàn)了 ApplicationListener 事件監(jiān)聽接口的 Bean 可以接收到容器事件 , 并對事件進(jìn)行響應(yīng)處理 ,。 在 ApplicationContext 抽象實(shí)現(xiàn)類AbstractApplicationContext 中,,我們可以發(fā)現(xiàn)存在一個(gè) ApplicationEventMulticaster,它負(fù)責(zé)保存所有監(jiān)聽器,,以便在容器產(chǎn)生上下文事件時(shí)通知這些事件監(jiān)聽者,。 MessageSource:為應(yīng)用提供 i18n 國際化消息訪問的功能; ResourcePatternResolver : 所 有 ApplicationContext 實(shí)現(xiàn)類都實(shí)現(xiàn)了類似于PathMatchingResourcePatternResolver 的功能,,可以通過帶前綴的 Ant 風(fēng)格的資源文件路徑裝載 Spring 的配置文件,。 LifeCycle:該接口是 Spring 2.0 加入的,該接口提供了 start()和 stop()兩個(gè)方法,,主要用于控制異步處理過程,。在具體使用時(shí),該接口同時(shí)被 ApplicationContext 實(shí)現(xiàn)及具體 Bean 實(shí)現(xiàn), ApplicationContext 會(huì)將 start/stop 的信息傳遞給容器中所有實(shí)現(xiàn)了該接口的 Bean,,以達(dá)到管理和控制 JMX,、任務(wù)調(diào)度等目的。 ConfigurableApplicationContext 擴(kuò)展于 ApplicationContext,,它新增加了兩個(gè)主要的方法: refresh()和 close(),,讓 ApplicationContext 具有啟動(dòng)、刷新和關(guān)閉應(yīng)用上下文的能力,。在應(yīng)用上下文關(guān)閉的情況下調(diào)用 refresh()即可啟動(dòng)應(yīng)用上下文,,在已經(jīng)啟動(dòng)的狀態(tài)下,調(diào)用 refresh()則清除緩存并重新裝載配置信息,,而調(diào)用close()則可關(guān)閉應(yīng)用上下文,。這些接口方法為容器的控制管理帶來了便利,但作為開發(fā)者,,我們并不需要過多關(guān)心這些方法,。
使用: 如果配置文件放置在類路徑下,用戶可以優(yōu)先使用 ClassPathXmlApplicationContext 實(shí)現(xiàn)類: 如果配置文件放置在文件系統(tǒng)的路徑下,,則可以優(yōu)先考慮使用 FileSystemXmlApplicationContext 實(shí)現(xiàn)類: Spring 3.0 支持基于類注解的配置方式,,主要功能來自于 Spring 的一個(gè)名為 JavaConfig 子項(xiàng)目,目前 JavaConfig已經(jīng)升級為 Spring核心框架的一部分,。 ApplicationContext 在初始化應(yīng)用上下文時(shí)就實(shí)例化所有單實(shí)例的 Bean,。 WebApplicationContext WebApplication體系架構(gòu): WebApplicationContext 是專門為 Web 應(yīng)用準(zhǔn)備的,它允許從相對于 Web 根目錄的路徑中裝載配置文件完成初始化工作,。從WebApplicationContext 中可以獲得 ServletContext 的引用,,整個(gè) Web 應(yīng)用上下文對象將作為屬性放置到 ServletContext 中,以便 Web 應(yīng)用環(huán)境可以訪問 Spring 應(yīng)用上下文,。 WebApplicationContext 定義了一個(gè)常量ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,,在上下文啟動(dòng)時(shí), WebApplicationContext 實(shí)例即以此為鍵放置在 ServletContext 的屬性列表中,,因此我們可以直接通過以下語句從 Web 容器中獲取WebApplicationContext:
Spring 和 Web 應(yīng)用的上下文融合: WebApplicationContext 的初始化方式:WebApplicationContext 需要 ServletContext 實(shí)例,,它必須在擁有 Web 容器的前提下才能完成啟動(dòng)的工作??梢栽?web.xml 中配置自啟動(dòng)的 Servlet 或定義 Web 容器監(jiān)聽器( ServletContextListener),,借助這兩者中的任何一個(gè)就可以完成啟動(dòng) Spring Web 應(yīng)用上下文的工作。Spring 分別提供了用于啟動(dòng) WebApplicationContext 的 Servlet 和 Web 容器監(jiān)聽器:
org.springframework.web.context.ContextLoaderServlet,; org.springframework.web.context.ContextLoaderListener 由于 WebApplicationContext 需要使用日志功能,,比如日志框架使用Log4J,用戶可以將 Log4J 的配置文件放置到類路徑 WEB-INF/classes 下,,這時(shí) Log4J 引擎即可順利啟動(dòng),。如果 Log4J 配置文件放置在其他位置,,用戶還必須在 web.xml 指定 Log4J 配置文件位置。
Bean的生命周期 1.當(dāng)調(diào)用者通過 getBean(beanName)向容器請求某一個(gè) Bean 時(shí),,如果容器注冊了org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor 接口,,在實(shí)例化 Bean 之前,,將調(diào)用接口的 postProcessBeforeInstantiation()方法,; 2.根據(jù)配置情況調(diào)用 Bean 構(gòu)造函數(shù)或工廠方法實(shí)例化 Bean; 3.如果容器注冊了 InstantiationAwareBeanPostProcessor 接口,,在實(shí)例化 Bean 之后,,調(diào)用該接口的 postProcessAfterInstantiation()方法,可在這里對已經(jīng)實(shí)例化的對象進(jìn)行一些“梳妝打扮”,; 4.如果 Bean 配置了屬性信息,,容器在這一步著手將配置值設(shè)置到 Bean 對應(yīng)的屬性中,不過在設(shè)置每個(gè)屬性之前將先調(diào)用InstantiationAwareBeanPostProcessor 接口的postProcessPropertyValues()方法,; 5.調(diào)用 Bean 的屬性設(shè)置方法設(shè)置屬性值,; 6.如果 Bean 實(shí)現(xiàn)了 org.springframework.beans.factory.BeanNameAware 接口,將調(diào)用setBeanName()接口方法,,將配置文件中該 Bean 對應(yīng)的名稱設(shè)置到 Bean 中,; 7.如果 Bean 實(shí)現(xiàn)了 org.springframework.beans.factory.BeanFactoryAware 接口,將調(diào)用 setBeanFactory()接口方法,,將 BeanFactory 容器實(shí)例設(shè)置到 Bean 中,; 8.如果 BeanFactory 裝配了 org.springframework.beans.factory.config.BeanPostProcessor后處理器,將調(diào)用 BeanPostProcessor 的 Object postProcessBeforeInitialization(Object bean, String beanName)接口方法對 Bean 進(jìn)行加工操作,。其中入?yún)?bean 是當(dāng)前正在處理的 Bean,,而 beanName 是當(dāng)前 Bean 的配置名,返回的對象為加工處理后的 Bean,。用戶可以使用該方法對某些 Bean 進(jìn)行特殊的處理,,甚至改變 Bean 的行為, BeanPostProcessor 在 Spring 框架中占有重要的地位,,為容器提供對 Bean 進(jìn)行后續(xù)加工處理的切入點(diǎn),, Spring 容器所提供的各種“神奇功能”(如 AOP,動(dòng)態(tài)代理等)都通過 BeanPostProcessor 實(shí)施,; 9.如果 Bean 實(shí)現(xiàn)了 InitializingBean 的接口,,將調(diào)用接口的 afterPropertiesSet()方法; 10.如果在通過 init-method 屬性定義了初始化方法,,將執(zhí)行這個(gè)方法,; 11.BeanPostProcessor 后處理器定義了兩個(gè)方法:其一是 postProcessBeforeInitialization() 在第 8 步調(diào)用;其二是 Object postProcessAfterInitialization(Object bean, String beanName)方法,,這個(gè)方法在此時(shí)調(diào)用,,容器再次獲得對 Bean 進(jìn)行加工處理的機(jī)會(huì),; 12.如果在中指定 Bean 的作用范圍為 scope=“prototype”,將 Bean 返回給調(diào)用者,,調(diào)用者負(fù)責(zé) Bean 后續(xù)生命的管理,, Spring 不再管理這個(gè) Bean 的生命周期。如果作用范圍設(shè)置為 scope=“singleton”,,則將 Bean 放入到 Spring IoC 容器的緩存池中,,并將 Bean引用返回給調(diào)用者, Spring 繼續(xù)對這些 Bean 進(jìn)行后續(xù)的生命管理,; 13.對于 scope=“singleton”的 Bean,,當(dāng)容器關(guān)閉時(shí),將觸發(fā) Spring 對 Bean 的后續(xù)生命周期的管理工作,,首先如果 Bean 實(shí)現(xiàn)了 DisposableBean 接口,,則將調(diào)用接口的afterPropertiesSet()方法,可以在此編寫釋放資源,、記錄日志等操作,; 14.對于 scope=“singleton”的 Bean,如果通過的 destroy-method 屬性指定了 Bean 的銷毀方法,, Spring 將執(zhí)行 Bean 的這個(gè)方法,,完成 Bean 資源的釋放等操作。
可以將這些方法大致劃分為三類: Bean 自身的方法:如調(diào)用 Bean 構(gòu)造函數(shù)實(shí)例化 Bean,,調(diào)用 Setter 設(shè)置 Bean 的屬性值以及通過的 init-method 和 destroy-method 所指定的方法,; Bean 級生命周期接口方法:如 BeanNameAware、 BeanFactoryAware,、 InitializingBean 和 DisposableBean,,這些接口方法由 Bean 類直接實(shí)現(xiàn); 容器級生命周期接口方法:在上圖中帶“★” 的步驟是由 InstantiationAwareBean PostProcessor 和BeanPostProcessor 這兩個(gè)接口實(shí)現(xiàn),,一般稱它們的實(shí)現(xiàn)類為“ 后處理器” ,。 后處理器接口一般不由 Bean 本身實(shí)現(xiàn),它們獨(dú)立于 Bean,,實(shí)現(xiàn)類以容器附加裝置的形式注冊到 Spring 容器中并通過接口反射為 Spring 容器預(yù)先識別,。當(dāng)Spring 容器創(chuàng)建任何 Bean 的時(shí)候,這些后處理器都會(huì)發(fā)生作用,,所以這些后處理器的影響是全局性的,。當(dāng)然,用戶可以通過合理地編寫后處理器,,讓其僅對感興趣Bean 進(jìn)行加工處理
ApplicationContext 和 BeanFactory 另一個(gè)最大的不同之處在于:ApplicationContext會(huì)利用 Java 反射機(jī)制自動(dòng)識別出配置文件中定義的 BeanPostProcessor,、 InstantiationAwareBeanPostProcessor 和 BeanFactoryPostProcessor,并自動(dòng)將它們注冊到應(yīng)用上下文中,;而后者需要在代碼中通過手工調(diào)用 addBeanPostProcessor()方法進(jìn)行注冊,。這也是為什么在應(yīng)用開發(fā)時(shí),,我們普遍使用 ApplicationContext 而很少使用 BeanFactory 的原因之一 IOC容器工作機(jī)制 容器啟動(dòng)過程 web環(huán)境下Spring容器、SpringMVC容器啟動(dòng)過程: 首先,,對于一個(gè)web應(yīng)用,,其部署在web容器中,web容器提供其一個(gè)全局的上下文環(huán)境,,這個(gè)上下文就是ServletContext,,其為后面的spring IoC容器提供宿主環(huán)境; 其次,,在web.xml中會(huì)提供有contextLoaderListener(或ContextLoaderServlet),。在web容器啟動(dòng)時(shí),,會(huì)觸發(fā)容器初始化事件,,此時(shí)contextLoaderListener會(huì)監(jiān)聽到這個(gè)事件,其contextInitialized方法會(huì)被調(diào)用,,在這個(gè)方法中,,spring會(huì)初始化一個(gè)啟動(dòng)上下文,這個(gè)上下文被稱為根上下文,,即WebApplicationContext,,這是一個(gè)接口類,確切的說,,其實(shí)際的實(shí)現(xiàn)類是XmlWebApplicationContext,。這個(gè)就是spring的IoC容器,其對應(yīng)的Bean定義的配置由web.xml中的context-param標(biāo)簽指定,。在這個(gè)IoC容器初始化完畢后,,spring容器以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE為屬性Key,將其存儲到ServletContext中,,便于獲?。?/p> 再次,,contextLoaderListener監(jiān)聽器初始化完畢后,,開始初始化web.xml中配置的Servlet,這個(gè)servlet可以配置多個(gè),,以最常見的DispatcherServlet為例(Spring MVC),,這個(gè)servlet實(shí)際上是一個(gè)標(biāo)準(zhǔn)的前端控制器,用以轉(zhuǎn)發(fā),、匹配,、處理每個(gè)servlet請求。DispatcherServlet上下文在初始化的時(shí)候會(huì)建立自己的IoC上下文容器,,用以持有spring mvc相關(guān)的bean,,這個(gè)servlet自己持有的上下文默認(rèn)實(shí)現(xiàn)類也是XmlWebApplicationContext,。在建立DispatcherServlet自己的IoC上下文時(shí),會(huì)利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE先從ServletContext中獲取之前的根上下文(即WebApplicationContext)作為自己上下文的parent上下文(即第2步中初始化的XmlWebApplicationContext作為自己的父容器),。有了這個(gè)parent上下文之后,,再初始化自己持有的上下文(這個(gè)DispatcherServlet初始化自己上下文的工作在其initStrategies方法中可以看到,大概的工作就是初始化處理器映射,、視圖解析等),。初始化完畢后,spring以與servlet的名字相關(guān)(此處不是簡單的以servlet名為Key,,而是通過一些轉(zhuǎn)換)的屬性為屬性Key,,也將其存到ServletContext中,以便后續(xù)使用,。這樣每個(gè)servlet就持有自己的上下文,,即擁有自己獨(dú)立的bean空間,同時(shí)各個(gè)servlet共享相同的bean,,即根上下文定義的那些bean,。
Bean加載過程 Spring的高明之處在于,它使用眾多接口描繪出了所有裝置的藍(lán)圖,,構(gòu)建好Spring的骨架,,繼而通過繼承體系層層推演,不斷豐富,,最終讓Spring成為有血有肉的完整的框架,。所以查看Spring框架的源碼時(shí),有兩條清晰可見的脈絡(luò): 1)接口層描述了容器的重要組件及組件間的協(xié)作關(guān)系,; 2)繼承體系逐步實(shí)現(xiàn)組件的各項(xiàng)功能,。 接口層清晰地勾勒出Spring框架的高層功能,框架脈絡(luò)呼之欲出,。有了接口層抽象的描述后,,不但Spring自己可以提供具體的實(shí)現(xiàn),任何第三方組織也可以提供不同實(shí)現(xiàn),, 可以說Spring完善的接口層使框架的擴(kuò)展性得到了很好的保證,。縱向繼承體系的逐步擴(kuò)展,,分步驟地實(shí)現(xiàn)框架的功能,,這種實(shí)現(xiàn)方案保證了框架功能不會(huì)堆積在某些類的身上,造成過重的代碼邏輯負(fù)載,,框架的復(fù)雜度被完美地分解開了,。 Spring組件按其所承擔(dān)的角色可以劃分為兩類: 1)物料組件:Resource、BeanDefinition,、PropertyEditor以及最終的Bean等,,它們是加工流程中被加工,、被消費(fèi)的組件,就像流水線上被加工的物料,;
2)加工設(shè)備組件:ResourceLoader,、BeanDefinitionReader、BeanFactoryPostProcessor,、InstantiationStrategy以及BeanWrapper等組件像是流水線上不同環(huán)節(jié)的加工設(shè)備,,對物料組件進(jìn)行加工處理。
InstantiationStrategy:負(fù)責(zé)實(shí)例化Bean操作,,相當(dāng)于Java語言中new的功能,,并不會(huì)參與Bean屬性的配置工作。屬性填充工作留待BeanWrapper完成 BeanWrapper:繼承了PropertyAccessor和PropertyEditorRegistry接口,,BeanWrapperImpl內(nèi)部封裝了兩類組件:(1)被封裝的目標(biāo)Bean(2)一套用于設(shè)置Bean屬性的屬性編輯器,;具有三重身份:(1)Bean包裹器(2)屬性訪問器 (3)屬性編輯器注冊表,。PropertyAccessor:定義了各種訪問Bean屬性的方法,。PropertyEditorRegistry:屬性編輯器的注冊表
該圖描述了Spring容器從加載配置文件到創(chuàng)建出一個(gè)完整Bean的作業(yè)流程: 1、ResourceLoader從存儲介質(zhì)中加載Spring配置信息,,并使用Resource表示這個(gè)配置文件的資源,; 2、BeanDefinitionReader讀取Resource所指向的配置文件資源,,然后解析配置文件,。配置文件中每一個(gè)解析成一個(gè)BeanDefinition對象,并保存到BeanDefinitionRegistry中,; 3,、容器掃描BeanDefinitionRegistry中的BeanDefinition,使用Java的反射機(jī)制自動(dòng)識別出Bean工廠后處理后器(實(shí)現(xiàn)BeanFactoryPostProcessor接口)的Bean,,然后調(diào)用這些Bean工廠后處理器對BeanDefinitionRegistry中的BeanDefinition進(jìn)行加工處理,。主要完成以下兩項(xiàng)工作:
1)對使用到占位符的元素標(biāo)簽進(jìn)行解析,得到最終的配置值,,這意味對一些半成品式的BeanDefinition對象進(jìn)行加工處理并得到成品的BeanDefinition對象,; 2)對BeanDefinitionRegistry中的BeanDefinition進(jìn)行掃描,通過Java反射機(jī)制找出所有屬性編輯器的Bean(實(shí)現(xiàn)java.beans.PropertyEditor接口的Bean),,并自動(dòng)將它們注冊到Spring容器的屬性編輯器注冊表中(PropertyEditorRegistry),;
4.Spring容器從BeanDefinitionRegistry中取出加工后的BeanDefinition,并調(diào)用InstantiationStrategy著手進(jìn)行Bean實(shí)例化的工作,; 5.在實(shí)例化Bean時(shí),,Spring容器使用BeanWrapper對Bean進(jìn)行封裝,,BeanWrapper提供了很多以Java反射機(jī)制操作Bean的方法,它將結(jié)合該Bean的BeanDefinition以及容器中屬性編輯器,,完成Bean屬性的設(shè)置工作,; 6.利用容器中注冊的Bean后處理器(實(shí)現(xiàn)BeanPostProcessor接口的Bean)對已經(jīng)完成屬性設(shè)置工作的Bean進(jìn)行后續(xù)加工,直接裝配出一個(gè)準(zhǔn)備就緒的Bean,。
總結(jié) Spring IOC容器主要有繼承體系底層的BeanFactory,、高層的ApplicationContext和WebApplicationContext Bean有自己的生命周期 容器啟動(dòng)原理:Spring應(yīng)用的IOC容器通過tomcat的Servlet或Listener監(jiān)聽啟動(dòng)加載;Spring MVC的容器由DispatchServlet作為入口加載,;Spring容器是Spring MVC容器的父容器 容器加載Bean原理:
BeanDefinitionReader讀取Resource所指向的配置文件資源,,然后解析配置文件。配置文件中每一個(gè)解析成一個(gè)BeanDefinition對象,,并保存到BeanDefinitionRegistry中,; 容器掃描BeanDefinitionRegistry中的BeanDefinition;調(diào)用InstantiationStrategy進(jìn)行Bean實(shí)例化的工作,;使用BeanWrapper完成Bean屬性的設(shè)置工作,;
單例Bean緩存池:Spring 在 DefaultSingletonBeanRegistry 類中提供了一個(gè)用于緩存單實(shí)例 Bean 的緩存器,它是一個(gè)用 HashMap 實(shí)現(xiàn)的緩存器,,單實(shí)例的 Bean 以 beanName 為鍵保存在這個(gè)HashMap 中,。 1、具有1-5工作經(jīng)驗(yàn)的,,面對目前流行的技術(shù)不知從何下手,,需要突破技術(shù)瓶頸的可以加群。 2,、在公司待久了,,過得很安逸,但跳槽時(shí)面試碰壁,。需要在短時(shí)間內(nèi)進(jìn)修,、跳槽拿高薪的可以加群。 3,、如果沒有工作經(jīng)驗(yàn),,但基礎(chǔ)非常扎實(shí),對java工作機(jī)制,,常用設(shè)計(jì)思想,,常用java開發(fā)框架掌握熟練的,可以加群,。 4,、覺得自己很牛B,一般需求都能搞定。但是所學(xué)的知識點(diǎn)沒有系統(tǒng)化,,很難在技術(shù)領(lǐng)域繼續(xù)突破的可以加群,。 5. Java架構(gòu)進(jìn)階群號:668395460
|