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());
}
}
- @PointCut中多个切点之间通过“||”进行连接。
- @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可以实现无侵入代码增强。
获取注解
获取注解,需要通过反射技术。
根据注解的位置不同,首选需要获取注释的对象(类、方法、属性等),然后获取对应的注解。详细可以参照第二篇参考文章。