BeanFactory和ApplicationContext有什么區(qū)別
>BeanFactory可以理解為含有bean集合的工廠類。BeanFactory包含了種bean的定義,以便在接收到客戶端請(qǐng)求時(shí)將對(duì)應(yīng)的bean實(shí)例化。
>BeanFactory還能在實(shí)例化對(duì)象的時(shí)生成協(xié)作類之間的關(guān)系。此舉將bean自身與bean客戶端的配置中解放出來(lái)。BeanFactory還包含了bean生命周期的控制,調(diào)用客戶端的初始化方法(initialization methods)和銷毀方法(destruction methods)。
>從表面上看,application context如同bean factory一樣具有bean定義、bean關(guān)聯(lián)關(guān)系的設(shè)置,根據(jù)請(qǐng)求分發(fā)bean的功能。但application context在此基礎(chǔ)上還提供了其他的功能。
>提供了支持國(guó)際化的文本消息
>統(tǒng)一的資源文件讀取方式
>已在監(jiān)聽(tīng)器中注冊(cè)的bean的事件
Spring Bean的生命周期
>Spring Bean的生命周期簡(jiǎn)單易懂。在一個(gè)bean實(shí)例被初始化時(shí),需要執(zhí)行一系列的初始化操作以達(dá)到可用的狀態(tài)。同樣的,當(dāng)一個(gè)bean不在被調(diào)用時(shí)需要進(jìn)行相關(guān)的析構(gòu)操作,并從bean容器中移除。
>Spring bean factory負(fù)責(zé)管理在spring容器中被創(chuàng)建的bean的生命周期。Bean的生命周期由兩組回調(diào)(call back)方法組成。
>初始化之后調(diào)用的回調(diào)方法。
>銷毀之前調(diào)用的回調(diào)方法。
>Spring框架提供了以下四種方式來(lái)管理bean的生命周期事件:
>InitializingBean和DisposableBean回調(diào)接口
>針對(duì)特殊行為的其他Aware接口
>Bean配置文件中的Custom init()方法和destroy()方法
>PostConstruct和 PreDestroy注解方式
Spring IOC如何實(shí)現(xiàn)
>Spring中的org.springframework.beans包和org.springframework.context包構(gòu)成了Spring框架IoC容器的基礎(chǔ)。
>BeanFactory接口提供了一個(gè)先進(jìn)的配置機(jī)制,使得任何類型的對(duì)象的配置成為可能。ApplicationContex接口對(duì)BeanFactory(是一個(gè)子接口)進(jìn)行了擴(kuò)展,在BeanFactory的基礎(chǔ)上添加了其他功能,比如與Spring的AOP更容易集成,也提供了處理message resource的機(jī)制(用于國(guó)際化)、事件傳播以及應(yīng)用層的特別配置,比如針對(duì)Web應(yīng)用的WebApplicationContext。
>org.springframework.beans.factory.BeanFactory是Spring IoC容器的具體實(shí)現(xiàn),用來(lái)包裝和管理前面提到的各種bean。BeanFactory接口是Spring IoC容器的核心接口。
說(shuō)說(shuō)Spring AOP
>面向切面編程,在我們的應(yīng)用中,經(jīng)常需要做一些事情,但是這些事情與核心業(yè)務(wù)無(wú)關(guān),比如,要記錄所有update*方法的執(zhí)行時(shí)間時(shí)間,操作人等等信息,記錄到日志
>通過(guò)spring的AOP技術(shù),就可以在不修改update*的代碼的情況下完成該需求。
Spring AOP實(shí)現(xiàn)原理
>Spring AOP中的動(dòng)態(tài)代理主要有兩種方式,JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理。JDK動(dòng)態(tài)代理通過(guò)反射來(lái)接收被代理的類,并且要求被代理的類必須實(shí)現(xiàn)一個(gè)接口。JDK動(dòng)態(tài)代理的核心是InvocationHandler接口和Proxy類。
>如果目標(biāo)類沒(méi)有實(shí)現(xiàn)接口,那么Spring AOP會(huì)選擇使用CGLIB來(lái)動(dòng)態(tài)代理目標(biāo)類。CGLIB(Code Generation Library),是一個(gè)代碼生成的類庫(kù),可以在運(yùn)行時(shí)動(dòng)態(tài)的生成某個(gè)類的子類,注意,CGLIB是通過(guò)繼承的方式做的動(dòng)態(tài)代理,因此如果某個(gè)類被標(biāo)記為final,那么它是無(wú)法使用CGLIB做動(dòng)態(tài)代理的。
動(dòng)態(tài)代理(cglib與JDK)
>JDK動(dòng)態(tài)代理類和委托類需要都實(shí)現(xiàn)同一個(gè)接口。也就是說(shuō)只有實(shí)現(xiàn)了某個(gè)接口的類可以使用Java動(dòng)態(tài)代理機(jī)制。但是,事實(shí)上使用中并不是遇到的所有類都會(huì)給你實(shí)現(xiàn)一個(gè)接口。因此,對(duì)于沒(méi)有實(shí)現(xiàn)接口的類,就不能使用該機(jī)制。而CGLIB則可以實(shí)現(xiàn)對(duì)類的動(dòng)態(tài)代理。
以上就是北大青鳥(niǎo)長(zhǎng)沙麓谷校區(qū)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“核心知識(shí)之Java框架基礎(chǔ)知識(shí)總結(jié)”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。