javascript
Spring框架基于AspectJ的AOP开发规范和步骤
AOP和動(dòng)態(tài)代理的關(guān)系:
AOP術(shù)語(yǔ):
需要新增的到業(yè)務(wù)代碼中的功能(在目標(biāo)對(duì)象那里叫橫切關(guān)注點(diǎn),在切面類(lèi)中叫通知)
封裝了增強(qiáng)方法(橫向關(guān)注點(diǎn))的類(lèi)
切面類(lèi)中的每一個(gè)增強(qiáng)的方法叫做通知,通知通過(guò)切入點(diǎn)表達(dá)式作用于連接點(diǎn)上
所抽取出來(lái)的代碼要作用的對(duì)象
切面要作用到目標(biāo)對(duì)象的具體位置,只能是四個(gè)位置,方法執(zhí)行前,方法執(zhí)行后,異常捕獲后,finilly后.
AOP的切面類(lèi)通過(guò)切入點(diǎn)找到對(duì)應(yīng)的連接點(diǎn)
大白話(huà)就是把所有需要增強(qiáng)的方法放在一個(gè)類(lèi)里,該類(lèi)就是切面類(lèi).切面類(lèi)包含了通知,通知就是需要增強(qiáng)的方法,aop通過(guò)切入點(diǎn)表達(dá)式讓通知作用于指定目標(biāo)方法的連接點(diǎn)上,可能是方法之前連接點(diǎn),方法之后連接點(diǎn).
一個(gè)切面中應(yīng)該包含@Aspect,通知,切入點(diǎn)表達(dá)式,才能夠作用在連接點(diǎn)上
切入點(diǎn)表達(dá)式的寫(xiě)法:
//第一個(gè) * 代表權(quán)限修飾符,返回值
//第二個(gè) * 代表該包下的所有的類(lèi)
//第三個(gè) * 代表該包下的所有的類(lèi)的所有方法
//…代表任意的參數(shù)列表
//切入到com.sms.spring.aop包下的所有類(lèi)的所有方法的前面
spring在解析這個(gè)切入點(diǎn)表達(dá)式之后,執(zhí)行前置|后置|返回通知時(shí),會(huì)將方法的信息封裝在JointPoint這個(gè)類(lèi)中:
public void before(JoinPoint joinpoint) {//joinPoint.getArgs():獲取方法的參數(shù)Object[] args = joinpoint.getArgs();String methodName = joinpoint.getSignature().getName();}公共切入點(diǎn)寫(xiě)法:@Pointcut
@Pointcut(value="execution(* com.sms.spring.aop.*.*(..))")public void test(){}公共切入點(diǎn)的使用:
@Before(value="test()")定義切面作用的優(yōu)先級(jí):@Order(數(shù)字),值越小優(yōu)先級(jí)越高
開(kāi)發(fā)步驟:
①導(dǎo)入jar包,或者直接使用maven導(dǎo)入
需要spring的四個(gè)核心jar(core,bean,context,expression)+aopalliance+spring-aop+cglib+spring-aspects+aspectjweaver
②創(chuàng)建spring核心xml文件,并引入aop和context的命名空間
③打開(kāi)spring的組件掃描和AspectJ動(dòng)態(tài)代理
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 開(kāi)啟組件掃描 --><context:component-scan base-package="com.sms.spring.aop"></context:component-scan><!-- 開(kāi)啟Asceptj的動(dòng)態(tài)代理功能 --><aop:aspectj-autoproxy /> </beans>④把目標(biāo)類(lèi)交給spring管理
給目標(biāo)類(lèi)添加@Component注解
⑤把包含增強(qiáng)方法的切面類(lèi)交給Spring管理并標(biāo)識(shí) 這是個(gè)切面類(lèi)
給切面類(lèi)添加@Component注解和@Aspect注解
⑥在切面類(lèi)中寫(xiě)增強(qiáng)方法,并給方法加上前置|后置|返回|異常 通知,編寫(xiě)切入點(diǎn)表達(dá)式,將該通知(增強(qiáng)方法)作用到連接點(diǎn)
@Before(value = "execution(* com.sms.spring.aop.*.*(..)")public void before(JoinPoint joinpoint) {//joinPoint.getArgs():獲取方法的參數(shù) }⑦使用Spring創(chuàng)建代理對(duì)象
其中必須得到接口對(duì)象,而非實(shí)現(xiàn)類(lèi)對(duì)象,因?yàn)榇韺?duì)象和實(shí)現(xiàn)類(lèi)對(duì)象實(shí)現(xiàn)共同的接口.
ApplicationContext ac= new ClassPathXmlApplicationContext("aop.xml"); MathI mathI = context.getBean("mathImpl", MathI.class);⑧使用該代理對(duì)象調(diào)用方法:方法被增強(qiáng)
ApplicationContext ac= new ClassPathXmlApplicationContext("aop.xml"); MathI mathI = context.getBean("mathImpl", MathI.class); mathI.method(); 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Spring框架基于AspectJ的AOP开发规范和步骤的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Eclipse旧版本Luna SR2(版
- 下一篇: Spring框架关于事务处理的API和使