spring aop的簡單使用方法詳解
AOP:【動態(tài)代理】
指在程序運(yùn)行期間動態(tài)的將某段代碼切入到指定方法指定位置進(jìn)行運(yùn)行的編程方式;
1、導(dǎo)入aop模塊;Spring AOP:(spring-aspects)
2、定義一個(gè)業(yè)務(wù)邏輯類(MathCalculator);在業(yè)務(wù)邏輯運(yùn)行的時(shí)候?qū)⑷罩具M(jìn)行打?。ǚ椒ㄖ?、方法運(yùn)行結(jié)束、方法出現(xiàn)異常,xxx)
3、定義一個(gè)日志切面類(LogAspects):切面類里面的方法需要?jiǎng)討B(tài)感知MathCalculator.div運(yùn)行到哪里然后執(zhí)行;
通知方法:
- 前置通知(@Before):logStart:在目標(biāo)方法(div)運(yùn)行之前運(yùn)行
- 后置通知(@After):logEnd:在目標(biāo)方法(div)運(yùn)行結(jié)束之后運(yùn)行(無論方法正常結(jié)束還是異常結(jié)束)
- 返回通知(@AfterReturning):logReturn:在目標(biāo)方法(div)正常返回之后運(yùn)行
- 異常通知(@AfterThrowing):logException:在目標(biāo)方法(div)出現(xiàn)異常以后運(yùn)行
- 環(huán)繞通知(@Around):動態(tài)代理,手動推進(jìn)目標(biāo)方法運(yùn)行(joinPoint.procced())
4、給切面類的目標(biāo)方法標(biāo)注何時(shí)何地運(yùn)行(通知注解);
5、將切面類和業(yè)務(wù)邏輯類(目標(biāo)方法所在類)都加入到容器中;
6、必須告訴Spring哪個(gè)類是切面類(給切面類上加一個(gè)注解:@Aspect)
[7]、給配置類中加 @EnableAspectJAutoProxy 【開啟基于注解的aop模式】
在Spring中很多的 @EnableXXX;
三步:
1)、將業(yè)務(wù)邏輯組件和切面類都加入到容器中;告訴Spring哪個(gè)是切面類(@Aspect)
2)、在切面類上的每一個(gè)通知方法上標(biāo)注通知注解,告訴Spring何時(shí)何地運(yùn)行(切入點(diǎn)表達(dá)式)
3)、開啟基于注解的aop模式;@EnableAspectJAutoProxy
package com.opk.bean;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import java.util.Arrays;
/*
* @Aspect: 告訴Spring當(dāng)前類是一個(gè)切面類
* wmy 13:03 2019/9/5
* @Param
* @return
**/
@Aspect
public class LogAspects {
//抽取公共的切入點(diǎn)表達(dá)式
//1、本類引用
//2、其他的切面引用
@Pointcut("execution(public * com.opk.bean.*.*(..))")
public void pointCut(){};
//@Before在目標(biāo)方法之前切入;切入點(diǎn)表達(dá)式(指定在哪個(gè)方法切入)
@Before("pointCut()")
public void logStart(JoinPoint joinPoint){
Object[] args = joinPoint.getArgs();
System.out.println(joinPoint.getSignature().getName()+":運(yùn)行。。。@Before,參數(shù)列表是:"+ Arrays.asList(args));
}
@After("com.opk.bean.LogAspects.pointCut()")
public void logEnd(JoinPoint joinPoint){
System.out.println(""+joinPoint.getSignature().getName()+"結(jié)束。。。@After");
}
//JoinPoint一定要出現(xiàn)在參數(shù)的第一位
@AfterReturning(value ="pointCut()",returning = "result")
public void logReturn(JoinPoint joinPoint,Object result){
System.out.println(""+joinPoint.getSignature().getName()+"正常返回。。。@AfterReturning:運(yùn)行結(jié)果:{"+result+"}");
}
@AfterThrowing(value ="pointCut()",throwing = "ex")
public void logException(JoinPoint joinPoint,Exception ex){
System.out.println(""+joinPoint.getSignature().getName()+"異常。。。異常信息:{"+ex+"}");
}
}
import org.springframework.stereotype.Component;
@Component
public class MathCalculator {
public int dev(int i,int j)
{
System.out.println("MathCalculator......");
return i/j;
}
}
@EnableAspectJAutoProxy
@Configuration
public class AOPConfig {
//業(yè)務(wù)邏輯類加入容器中
@Bean("calculator")
public MathCalculator calculator(){
return new MathCalculator();
}
//切面類加入到容器中
@Bean
public LogAspects logAspects(){
return new LogAspects();
}
}
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(AOPConfig.class);
ctx.refresh();
MathCalculator bean = (MathCalculator)ctx.getBean("calculator");
bean.dev(10,3);
}
運(yùn)行結(jié)果:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
初學(xué)者易上手的SSH-struts2 01環(huán)境搭建(圖文教程)
下面小編就為大家?guī)硪黄鯇W(xué)者易上手的SSH-struts2 01環(huán)境搭建(圖文教程)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
Spring Boot項(xiàng)目利用Redis實(shí)現(xiàn)session管理實(shí)例
本篇文章主要介紹了Spring Boot項(xiàng)目利用Redis實(shí)現(xiàn)session管理實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Java實(shí)現(xiàn)經(jīng)典游戲超級瑪麗的示例代碼
在你的童年記憶里,是否有一個(gè)蹦跳、頂蘑菇的小人?本文將用java語言實(shí)現(xiàn)經(jīng)典游戲《超級瑪麗》,文中采用了swing技術(shù)進(jìn)行了界面化處理,需要的可以參考一下2022-02-02
Java去掉小數(shù)點(diǎn)后面無效0的方案與建議
當(dāng)前小數(shù)點(diǎn)后面的位數(shù)過多的時(shí)候,多余的0沒有實(shí)際意義,下面這篇文章主要給大家介紹了關(guān)于Java去掉小數(shù)點(diǎn)后面無效0的方案與建議,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07

