本文共 3913 字,大约阅读时间需要 13 分钟。
pointcut recordLog():call(* HelloWord.sayHello(..));
@Aspectpublic class AspectJ { /** * 前置通知 */ @Before("execution(* aop.UserDao.addUser(..))") public void before(){ System.out.println("前置通知"); } /** * 后置通知 * returnVal,切点方法执行后的返回值 */ @AfterReturning(value="execution(* aop.UserDao.addUser(..))",returning = "returnVal") public void AfterReturning(Object returnVal){ System.out.println("后置通知...."+returnVal); } /** * 环绕通知 * @param joinPoint 可用于执行切点的类 * @return * @throws Throwable */ @Around(value="execution(* aop.UserDao.addUser(..))") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("环绕前....."); Object result = joinPoint.proceed(); System.out.println("环绕后....."); return result; } /** * 抛出通知 * @param e */ @AfterThrowing(value = "execution(* aop.UserDao.addUser(..))",throwing = "e") public void afterThrowable(Throwable e){ System.out.println("出现异常:msg="+e.getMessage()); } /** * 无论什么时候都会执行 */ @After(value = "execution(* aop.UserDao.addUser(..))") public void after(){ System.out.println("最终通知...."); }}或者@Pointcut(value = "execution( * aop.UserDao.addUser(..))")public void p1(){}/** * 前置通知 */@Before(value = "p1()")public void before(){ System.out.println("前置通知");}
.. 匹配方法中任意参数数量的方法within(com.zejian.dao..*) 匹配该类中的所有方法within(com.zejian.dao.DaoUser+) 匹配该类的所有子类/实现该接口的类的所有方法within(com.zejian.service..*) 匹配 该包及子包下的所有方法类型签名表达式within()方法签名表达式//匹配UserDaoImpl类中的所有方法 @Pointcut("execution(* com.zejian.dao.UserDaoImpl.*(..))") //匹配UserDaoImpl类中的所有公共的方法 @Pointcut("execution(public * com.zejian.dao.UserDaoImpl.*(..))") //匹配UserDaoImpl类中的所有公共方法并且返回值为int类型 @Pointcut("execution(public int com.zejian.dao.UserDaoImpl.*(..))") //匹配UserDaoImpl类中第一个参数为int类型的所有公共的方法 @Pointcut("execution(public * com.zejian.dao.UserDaoImpl.*(int , ..))")bean@Pointcut("bean(*Service)") 用于匹配后缀为service的bean private void myPointcut1(){}this 用于匹配当前AOP代理对象类型的执行方法and or not ! && ||
Aspect的优先级
不同切面
基于注解的 @Order(0,1,2)
AOP的应用场景异常统计
实现原理cglib 继承
附上代码
public class CglibProxy implements MethodInterceptor { //被代理对象 private A target; public CglibProxy(A target) { super(); this.target = target; } public A createProxy(){ // 1.声明增强类实例,用于生产代理类 Enhancer enhancer = new Enhancer(); // 2.设置被代理类字节码,CGLIB根据字节码生成被代理类的子类 enhancer.setSuperclass(target.getClass()); // 3.设置回调函数 enhancer.setCallback(this); // 创建代理 return (A) enhancer.create(); } /** * 回调函数 */ @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { if("execute".equals(method.getName())) { //调用前验证权限(动态添加其他要执行业务) // AuthCheck.authCheck(); //调用目标对象的方法(执行A对象即被代理对象的execute方法) Object result = methodProxy.invokeSuper(proxy, args); //记录日志数据(动态添加其他要执行业务) // Report.recordLog(); return result; } return methodProxy.invokeSuper(proxy,args); }}
参考博客
转载地址:http://mqiii.baihongyu.com/