AOP和自定义注解的使用

AOP和自定义注解的使用

  • 一、AOP的使用
  • 二、自定义注解

一、AOP的使用

关于aop的详解可参考以下几篇文章。
AOP统计接口访问次数
AOP记录接口调用次数
Spring中XML配置AOP ***

对于AOP的理解:
     AOP通过代理的方式,通过预编译方式和运行期间动态代理实现程序功能的一种技术。通俗讲就是在给目标代码增加了触发器,开发人员可以控制在目标方法调用前(@Before)、抛出异常时(@AfterThrowing)、正常执行后(@AfterReturning)、最终结束(@After)、环绕通知(@Around,手动定义触发时机),在指定时机触发时织入新增代码。
    通过不改动源码的情况下,加入增强逻辑,通常是:权限控制、事务控制、日志代码、性能监控

/**
 * 通过AOP对数据共享/接入API进行监控统计
 **/
@Component
@Aspect
public class APIMonitorHandler {
    private final static Logger log = LoggerFactory.getLogger(APIMonitorHandler.class);
   
    @Pointcut(value = "@annotation(com.fawkes.lhcity.common.annotation.APIMonitor) || " + 
    "execution(public void com.fawkes.lhcity.modules.digital.projectreport.controller.*.*(int, java.lang.String))")
    public void pointCut(){}
    
    @After(value = "pointCut()")
    public void doAfter(JoinPoint joinPoint) {
        HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
        //业务代码。。。
    }

    @AfterThrowing(pointcut = "pointCut()")
    public void doAfterThrowing(JoinPoint joinPoint) {
        HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
        log.info("接口访问失败, URI : [{}]", request.getRequestURI());
    }
}
  1. @PointCut中多个切点之间通过“||”进行连接。
  2. @PointCut中切点定义表达式书写格式

execution(public void com.fawkes.lhcity.modules.digital.projectreport.controller.⭐.⭐(int, java.lang.String))

  • 访问修饰符可以省略,返回值(void)可以用⭐表示,实体类和方法名可以用⭐表示代表同级所有的。参数基本类型可直接写,应用类型需要些全路径名。

二、自定义注解

自定义注解参考文章:
自定义注解详细介绍
AOP与自定义注解的配合使用 ****
对于自定义注解的理解:
    书写自定义注解,需要首先搞清楚4个元注解的含义。

@Target:注解可以使用的地方;
@Documented:是否随着java文件生成到javadoc文件中
@Retention:该注解保持的持久程度。(源码阶段,编译到Class文件阶段、运行阶段)
@Inherited:自定义注解写在父类声明处,则子类自动拥有该注解。

/** @description 标记数据权限控制的方法,该方法第一个参数必须为包含dataAuthProjectIds的实体类
 **/
@Target(value = ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DataAuthority {
}

常规使用的注解,一般点明Target和Rentention。自定义注解主要是用于标记点,不会影响源代码,配合AOP可以实现无侵入代码增强。
获取注解
    获取注解,需要通过反射技术。
根据注解的位置不同,首选需要获取注释的对象(类、方法、属性等),然后获取对应的注解。详细可以参照第二篇参考文章。

你可能感兴趣的:(java之路,java,spring,servlet)