zoukankan      html  css  js  c++  java
  • Spring AOP之注解实现

    在自定义个注解之后,通过这个注解,标注需要切入的方法,同时把需要的参数传到切面去。那么我们怎么在切面使用这个注解。
    我们使用这个自定义注解一方面是为了传一些参数,另一方面也是为了省事。
    具体怎么省事,看我下面的例子就造啦。

    xml中设置

    <aop:aspectj-autoproxy proxy-target-class="true" />

    一般,别人的切面都是这么写的
    先声明一个切入点。

    //切入点签名
    @Pointcut("execution(* com.lxk.spring.aop.annotation.PersonDaoImpl.*(..))")
    private void aa() {
    }

    切入点声明OK之后,就是在不同的 advice 里面使用啦。一般都是如下使用。

    //前置通知
    @Before("aa()")
     
    //后置通知
    @AfterReturning(value = "aa()", returning = "val")
    public void afterMethod(JoinPoint joinPoint, Object val) {}
     
    //最终通知
    @After("aa()")
     
    //环绕通知
    @Around("aa()")
     
    //异常通知
    @AfterThrowing(value = "aa()", throwing = "ex")
    public void throwingMethod(Throwable ex) {}

    这些切面方法里面的参数。JoinPoint joinPoint,这个是哪个都可以加的。加不加随意。需要的话就加。是可以用的。

    要是带个咱自定义的注解呢?

    我又看到很多人都是如下写的。
    我就不全部带上了,就以这个after为例,看看是如何写的吧

    @After(value = "aa() && @annotation(methodLog)", argNames = "joinPoint, methodLog")
    public void methodAfter(JoinPoint joinPoint, MethodLog methodLog) throws Throwable {}

    按照上面这写,没毛病,因为别人都是这么写的,我也确实验证啦,这个能拿到咱定义的注解,以及注解上的参数。

    还有个写法,就是不用显示的声明切入点,就是那个@Pointcut 

    先说下这个显示声明的好处,就像声明变量一样,因为这个切入点表达式是可以用 &&  ||   !来组合条件的,这么声明的话,可以使得代码简洁。
    直接在各类 advice 通知的参数上面,使用execution来声明。
    例如:

    @Around(value = "(execution(* com.lxk.service..*(..))) && @annotation(methodLog)", argNames = "joinPoint, methodLog")
    public Object methodAround(ProceedingJoinPoint joinPoint, MethodLog methodLog) throws Throwable {}

    其实,上面的value里面的意思,就是复合那个切入的点的条件, 以&&连接,也就是说2个都符合。
    既然咱自定义了注解,就是来干这个切面的,为啥还要对他是哪个包,要限制一下呢,我就把前面的给删除啦。
    最终简化如下:

    @Around(value = "@annotation(methodLog)")
    public Object methodAround(ProceedingJoinPoint joinPoint, MethodLog methodLog) throws Throwable {}

    代码依然正常运行。

    既然不用加那个包的限制,这切面还是OK的,为啥还要加呢?

    我稍微考虑下,估计是这么个原因:

    自定义注解命名的时候,可能你取的名字很大众化,其他的jar包,也就是你项目引入的jar包,可能有重名的注解,如果要是不加包限制的话,那估计就会出现意想不到的效果。所以,我们就看到,那么多的切面代码,这地方的写法都是千篇一律 都是使用 && 符号。限制包,然后限制使用的是哪个注解。

  • 相关阅读:
    构建可视化基础——集成SVG
    构建可视化基础——使用HTML Canvas
    【目录】LeetCode Java实现
    【目录】数据结构与算法
    【目录】《剑指Offer》Java实现
    【LeetCode】102. Binary Tree Level Order Traversal
    【LeetCode】145. Binary Tree Postorder Traversal
    【LeetCode】144. Binary Tree Preorder Traversal
    【LeetCode】230. Kth Smallest Element in a BST
    【LeetCode】94. Binary Tree Inorder Traversal
  • 原文地址:https://www.cnblogs.com/zhaoyibing/p/9516478.html
Copyright © 2011-2022 走看看