zoukankan      html  css  js  c++  java
  • 自定义注解

    前言

    目标:将各个类及各个方法进行区分模块、区分方法操作类型,把方法内的操作记录到日志。

    这篇也算是自定义注解的一个应用场景。

    方案

    自定义注解

    在各个类和方法上标记自定义的注解

    定义切面(切面对标记注解的方法进行@After或@Before之类的操作)

    记录详细日志:按模块、操作类型记录到文件

    代码实现

    https://gitlab.com/xiguanchendian/xgcd-lab

    大致扫一眼吧

    联想到的

    说到切面,联想到项目中依赖了第三方的jar包,可是由于业务需求,需要对其中某个特定方法进行修改(或者说压根不用它们的方法,完全按自己的业务逻辑来)。

    与上面@Before、@After等不同的是,这里用到了@Around,虽然是@Around,但只是走的自己业务逻辑代码。

    是否走原代码的关键在于使用@Around注解时的

    proceedingJoinPoint.proceed();

    @Around注解使用时需要注意一点就是,环绕通知不能改变原方法的返回值,切面方法需要有返回值来代替原方法的返回值,代码大致如下:

    /**
         * 使用 AOP @Around后无返回值问题:
         * 环绕通知不能改变原方法的返回值,切面方法需要有返回值来代替原方法的返回值
         *
         * @param proceedingJoinPoint
         */
        @Around("logAdvicePointCut()")
        public Object doAround(ProceedingJoinPoint proceedingJoinPoint) {
            try {
                System.out.println("doAround before...");
                Object proceed = proceedingJoinPoint.proceed();
                System.out.println("doAround after...");
                return proceed;
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
            return null;
        }

    再次联想到的

    在使用切面时,发现只有public方法才有效,private不行,难道说spring的AOP只能切public?

    如果是那也太捞了,前辈们在设计之初就考虑到这个问题了,验证aop不仅能切public,连private也能切:

    blablabla。。。

    感谢

    自定义注解详细介绍(详细易懂)

    Spring AOP在pointcut expression解析表达式 并匹配多个条件

    Spring实现AOP的4种方式

     

  • 相关阅读:
    小希的迷宫
    不下降序列
    Stones on the Table
    glsl之纹理演示
    glsl之多重纹理演示
    6.12
    这狗日的生活
    小楼一夜听春雨,天下谁人不识君?
    lua 调用C/C++
    D3DFVF_XYZ和D3DFVF_XYZRHW的区别
  • 原文地址:https://www.cnblogs.com/yadongliang/p/14161923.html
Copyright © 2011-2022 走看看