aop概念
概念:面向切面編程
作用:不用修改原來的類就可以添加新功能
aop術(shù)語
- joinpoint 連接點(diǎn):類中可以被增強(qiáng)的方法(其實(shí)就是類中的方法)
- pointcut 切入點(diǎn):類中實(shí)際被增強(qiáng)的方法(并不是所有的方法都被增強(qiáng)了)
- advice 通知/增強(qiáng):實(shí)際擴(kuò)展功能的邏輯,有下面幾種類型
- before 前置增強(qiáng):方法執(zhí)行之前
- after-returning 后置增強(qiáng):方法正常執(zhí)行之后,如果出現(xiàn)異常决瞳,則不能增強(qiáng)
- after-throwing 異常增強(qiáng):出現(xiàn)異常的時候
- after 最終增強(qiáng):一定會執(zhí)行的增強(qiáng)妹窖,無論是否出現(xiàn)異常辩蛋,相當(dāng)于finally代碼塊
- around 環(huán)繞增強(qiáng):方法之前和之后執(zhí)行
- aspect 切面:把增強(qiáng)用到切入點(diǎn)的過程
- target 目標(biāo):被增強(qiáng)方法所在的類
- weaving 織入:將增強(qiáng)應(yīng)用到目標(biāo)的過程
AOP實(shí)現(xiàn)方式
Spring實(shí)現(xiàn)aop操作有兩種方式:
1凑术、Spring-aop
2挽霉、AspectJ
1防嗡、spring-aop(使用xml文件實(shí)現(xiàn)AOP)
使用步驟
1、導(dǎo)包
spring-aop.jar侠坎、aspectjweaver.jar
<!-- 被增強(qiáng)的類 -->
<bean class="com.hemi.bean.Car" id="car"></bean>
<!-- 實(shí)施增強(qiáng)的類 -->
<bean class="com.hemi.bean.CarUtils" id="carUtils"></bean>
<!-- 配置aop -->
<aop:config>
<!-- 切入點(diǎn):被增強(qiáng)的方法 -->
<aop:pointcut expression="execution(public void com.hemi.bean.Car.run(..))" id="pointcut1"/>
<!-- 切面:將切面運(yùn)用到切入點(diǎn)的過程 -->
<aop:aspect ref="carUtils">
<aop:before method="show" pointcut-ref="pointcut1"/>
</aop:aspect>
</aop:config>
標(biāo)簽詳解
2蚁趁、AspectJ(使用注解實(shí)現(xiàn)AOP)
使用步驟
1、導(dǎo)包
spring-aspects.jar实胸、aspectjweaver.jar
2他嫡、通過xml文件開啟aspectj注解
<aop:aspectj-autoproxy/>
3、創(chuàng)建增強(qiáng)類
@Aspect//1庐完、標(biāo)示該類是增強(qiáng)類
@Service
public class StudentUtils {
//2钢属、配置切入點(diǎn),括號內(nèi)是表達(dá)式
@Pointcut("execution(* com.hemi.bean.Student.study(..))")
public void pointcut(){}
//3门躯、前置增強(qiáng)淆党,括號內(nèi)寫切入點(diǎn)的名稱,即上面的方法名
@Before("pointcut()")
public void high(Joinpoint jp){
System.out.println("玩會手機(jī)生音。宁否。。缀遍。");
jp.getArgs();//獲取參數(shù)
}
@Around("pointcut()")
public void show(ProceddingJoinpointcut pjp){//ProceddingJoinpointcut只有在環(huán)繞增強(qiáng)時可以用
pjp.getSignature().getDeclaringType();//獲取方法名
}
}
注解詳解
重點(diǎn)關(guān)注
- @After
- @AfterThrowing
- @Around