AOP-Aspect-Oriented Programming
面向切面編程與函數(shù)式編程骆撇、面向過程編程等一樣屬于編程范式,所以他是一種思想而不是技術(shù)调鬓。
切面是什么房匆?
切分功能性需求和非功能型需求。例如緩存叛拷、日志舌厨、權(quán)限控制、事務(wù)管理等忿薇。
SpringCore-AOP
Spring充分利用了IoC容器Proxy代理對象以及AOP攔截器的功能特性裙椭,通過這些對AOP基本功能的封裝機(jī)制,為用戶提供了AOP的實現(xiàn)框架署浩。
使用@Aspect標(biāo)注切面組件
使用@Pointcut()標(biāo)注切入點揉燃,可以使用表達(dá)式或注解等方式
@Pointcut("@annotation(annotation.Admin)")
@Pointcut("execution(* service.AppleService.*(..))")
使用@Before、@After瑰抵、@AfterReturning你雌、@AfterThrowing、@Around在各個時機(jī)插入想執(zhí)行的代碼
SpringCore-AOP實現(xiàn)原理
運(yùn)行時織入的動態(tài)代理
當(dāng)目標(biāo)對象實現(xiàn)了接口婿崭,默認(rèn)采用JDK動態(tài)代理(基于接口)JDK只能對有接口的類進(jìn)行動態(tài)代理
當(dāng)目標(biāo)對象沒有實現(xiàn)接口,則采用Cglib動態(tài)代理(基于繼承)Cglib無法對private和static方法進(jìn)行動態(tài)代理
JDK動態(tài)代理
Cglib動態(tài)代理
目標(biāo)類實現(xiàn)了接口肴颊,用JDK動態(tài)代理
目標(biāo)類沒有實現(xiàn)接口氓栈,用Cglib動態(tài)代理
強(qiáng)制使用Cglib代理,使用Cglib
SpringCore-AOP如何嵌套
責(zé)任鏈模式婿着,鏈?zhǔn)秸{(diào)用