話不多少現在的需求就是我們模擬一個簡單的除以方法說起:
public class MathCalculator { public int div(int i,int j){ System.out.println("MathCalculator...div..."); return i/j; } }
AOP指在程序運行期間動態的將某段代碼切入到指定方法指定位置進行運行的編程方式;
沒錯就是這麼簡單那麼我們要幹什麼呢?說的就是AOP嘛我們給它做個切面,也就是跟蹤到它算到哪兒了,遇到異常返回一類的,換句話說就是日誌嘛我們由此引入AOP上代碼+註釋嘍需求說明:
定義一個業務邏輯類(MathCalculator);在業務邏輯運行的時候將日誌進行打印(方法之前、方法運行結束、方法出現異常,xxx)
* 3、定義一個日誌切面類(LogAspects):切面類裏面的方法需要動態感知MathCalculator.div運行到哪裏然後執行;
代碼目錄:
好我們上代碼這個就是我們的切面類:
@Aspect public class LogAspects { @Pointcut("execution(public int cn.test.aop.MathCalculator.*(..))")//切入點我們都抽取到這裏面 public void pointcut(){} //前置通知 @Before("pointcut()")//@Before在目標方法之前切入;切入點表達式(指定在哪個方法切入) public void logStart(JoinPoint joinPoint){ Object[] args = joinPoint.getArgs(); System.out.println(""+joinPoint.getSignature().getName()+"除法運行@Before.....參數{"+Arrays.asList(args)+"}"); } //後置通知 @After("pointcut()") public void logEnd(JoinPoint joinPoint){ System.out.println(""+joinPoint.getSignature().getName()+"除法結束@After{}"); } //正常返回執行 @AfterReturning(value = "pointcut()",returning = "result") public void logReturn(JoinPoint joinPoint,Object result){ System.out.println("除法正常運行"+joinPoint.getSignature().getName()+"@AfterReturning{"+result+"}"); } //異常信息 @AfterThrowing(value = "pointcut()",throwing = "exception") public void lodExpetion(JoinPoint joinPoint,Exception exception){ System.out.println("除法異常"+joinPoint.getSignature().getName()+"...@AfterThrowing{"+exception+"}"); } }
順便附上各個切面的用法:
通知方法:
* 前置通知(@Before):logStart:在目標方法(div)運行之前運行
* 後置通知(@After):logEnd:在目標方法(div)運行結束之後運行(無論方法正常結束還是異常結束)
* 返回通知(@AfterReturning):logReturn:在目標方法(div)正常返回之後運行
* 異常通知(@AfterThrowing):logException:在目標方法(div)出現異常以後運行
@Pointcut是用來攔截裏面參數說有的方法 其他的我就不做說明了我們看到我們把何時何地切入,怎麼切入都告訴這個類瞭然後呢?
@EnableAspectJAutoProxy @Configuration public class MyConfigofAOP { //將切面類和業務邏輯類(目標方法所在類)都加入到容器中; @Bean public MathCalculator mathCalculator(){ return new MathCalculator(); } //切面類 @Bean public LogAspects logAspects(){ return new LogAspects(); } }
這樣我們們都把它交給了IOC去處理啦
重要說明:
*4、給切面類的目標方法標註何時何地運行(通知註解);
* 5、將切面類和業務邏輯類(目標方法所在類)都加入到容器中;
* 6、必須告訴Spring哪個類是切面類(給切面類上加一個註解:@Aspect)
* [7]、給配置類中加 @EnableAspectJAutoProxy 【開啓基於註解的aop模式】
* 在Spring中很多的 @EnableXXX;
//JoinPoint一定要出現在參數表的第一位 關於和玩意兒是什麼請右拐百度
好了我們改切的也切了,該配置的也配置了那就啓動實施了:
@Test public void test01() { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfigofAOP.class); //不要自己創建對象,要用ioc裏面的哦 /*MathCalculator mathCalculator = new MathCalculator(); mathCalculator.div(1, 1);*/ MathCalculator bean = applicationContext.getBean(MathCalculator.class); bean.div(1,1); applicationContext.close(); }
輸出正常:我們同時也做了異常處理那就試一下異常:
最後貼出要的pom.xml
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.12.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>4.3.12.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.12.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>4.3.12.RELEASE</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>ok這個例子我們瞭解了AOP的註解配置的形式那麼下一篇我們追一追源碼