Aware相關(guān)接口,表示在Spring實(shí)例化Bean之前進(jìn)行相關(guān)的調(diào)用
例如:準(zhǔn)備工作-->打掃工作
BeanNameAware表示在Spring實(shí)例化Bean之前進(jìn)行調(diào)用
ApplicationContextAware: 在Bean類被初始化之后,將會(huì)被注入ApplicationContext實(shí)例
//ApplicationContext實(shí)例由系統(tǒng)自動(dòng)添加上去
public void setApplicationContext (ApplicationContext
arg0) throws BeansException {
}
消息支持
ApplicationContext繼承了MessageSource接口,用戶可以直接使用
事件監(jiān)聽:
容器關(guān)閉
容器初始化
在Web中請(qǐng)求處理的時(shí)候
CGLIB
spring對(duì)AOP的支持
Asepect默認(rèn)情況下不用實(shí)現(xiàn)接口,但對(duì)于目標(biāo)對(duì)象(UserManagerImpl.java),在默認(rèn)情況下必須實(shí)現(xiàn)接口,如果沒有實(shí)現(xiàn)接口必須引入CGLIB庫(kù)
我們可以通過Advice中添加一個(gè)JoinPoint參數(shù),這個(gè)值會(huì)由spring自動(dòng)傳入,從JoinPoint中可以取得參數(shù)值、方法名等等。
1、 如果目標(biāo)對(duì)象實(shí)現(xiàn)了接口,默認(rèn)情況下會(huì)采用JDK的動(dòng)態(tài)代理實(shí)現(xiàn)AOP
2、 如果目標(biāo)對(duì)象實(shí)現(xiàn)了接口,可以強(qiáng)制使用CGLIB實(shí)現(xiàn)AOP
3、 如果目標(biāo)對(duì)象沒有實(shí)現(xiàn)接口,必須采用CGLIB庫(kù),spring會(huì)自動(dòng)在JDK動(dòng)態(tài)代理和CGLIB之間轉(zhuǎn)換
à如何強(qiáng)制使用CGLIB實(shí)現(xiàn)AOP?
*添加CGLIB庫(kù),SPRING_HOME/cglib/*.jar
*在 spring配置文件中加入<aop:aspect-autoproxy
proxy-target-class=”true”/>
JDK動(dòng)態(tài)代理和CGLIB字節(jié)碼生成的區(qū)別?
*JDK動(dòng)態(tài)代理只能對(duì)實(shí)現(xiàn)了接口的類生成代理,而不能針對(duì)類
*CGLIB是針對(duì)實(shí)現(xiàn)代理,主要是對(duì)指定的類生成一個(gè)子類,覆蓋其中的方法
因?yàn)槭抢^承,所以該類或方法最好不要聲明成final
--
學(xué)海無涯