目录
文章学习
切面相关文章一 切面相关文章二 切面表达式1 表达式2
从上面的两片文章中可以知道页面术语包括:前置通知、后置通知、环绕通知、最终通知、异常通知,AOP是在不修改源码的情况下给程序动态统一添加功能,增加了代码的复用性省去了测试的时间、精简了代码。
AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。
Demo
-
Ctrl & Service Demo:
-
AOP DEMO
package com.gisquest.zrzy.tdcbitem.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
/**
* Created by Administrator on 2019/11/28.
*/
@Aspect
@Component
public class LogInterceptor {
//这个可用来替代以后重复出现的. 直接在后面的Before("myMethod()")就行了.
// @Pointcut("execution(public * com.dao.impl..*.*(..))")
@Pointcut("execution(public * com.gisquest.zrzy.tdcbitem.impl.gyzd..*.*(..))")
public void myMethod(){};
//下面用到的是织入点语法, 看文档里面有. 就是指定在该方法前执行
//@Before("execution(public void com.dao.impl.UserDAOImp.save(com.model.User))")
//记住下面这种通用的, *表示所有
// @Before("execution(public * com.dao.impl..*.*(..))")
@Before("execution(public void com.gisquest.zrzy.tdcbitem.impl.gyzd.TdzdzbsxServiceImpl..*.*(..))")
public void beforeMethod()
{
System.out.println("save start......");
}
//正常执行完后
// @AfterReturning("execution(public * com.dao.impl..*.*(..))")
@AfterReturning("execution(public * com.gisquest.zrzy.tdcbitem.impl.gyzd..*.*(..))")
public void afterReturnning()
{
System.out.println("after save......");
}
//抛出异常时才调用
@AfterThrowing("myMethod()")
public void afterThrowing()
{
System.out.println("after throwing......");
}
//环绕, 这个特殊点.
@Around("myMethod()")
public void aroundMethod(ProceedingJoinPoint pjp) throws Throwable
{
//加逻辑的时候, 不要依赖执行的的先后顺序
System.out.println("method around start!");
pjp.proceed();
System.out.println("method around end!");
}
}
-
执行结果
其他
如果你切的是Dao层的insert或者update,可以写成下面的
aroundInsert 在环绕式声明中被调用
-
最简单的切面方法Demo
- AOP注解包括
@Pointcut @Before @After @AfterReturning @After
-
AOP注解执行顺序
@Around (method around start!)-》@Before -》进入XCtrl -》 进入XServiceImpl -》@Around(method around start!) -》@After -》@AfterReturing