自定义注解
创建自定义注解可以通过 @interface 关键字来实现,并且需要导入 java.lang.annotation.Target 和 java.lang.annotation.Retention。其中,Target 枚举用于指定注解可以应用的目标类型,而 Retention 枚举用于指定注解的保留策略。
/** * 参数校验 */ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface ParameterValidation { }
AOP代理
在 Spring 中,通过使用 @Aspect 注解来创建 AOP 切面,并且需要将切面类标记为 Spring 组件,以便 Spring 能够扫描到它。
package co.yixiang.accounting_system.section; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect @Component public class NotNullParamsAspect { @Before("execution(* *(.., @co.yixiang.accounting_system.entity.Annotations.ParameterValidation (*), ..))") public void validateNotNullParams(JoinPoint point) { Object[] args = point.getArgs(); for (Object arg : args) { if (arg == null) { throw new IllegalArgumentException("Argument cannot be null"); } } } }
AOP的四大类型
在面向切面编程中,有四种主要的切入点类型,分别是前置通知、后置返回通知、后置异常通知和后置最终通知。
- 前置通知:在目标方法执行之前执行的通知。
- 后置返回通知:在目标方法成功执行并返回结果后执行的通知。
- 后置异常通知:在目标方法抛出异常后执行的通知。
- 后置最终通知:在目标方法执行后无论是否发生异常都会执行的通知。
JoinPoint
JoinPoint 表示程序执行过程中的连接点,在 AOP 中常用于确定切入点。以下是四个常见的 JoinPoint 类型:
- 方法执行:代表了方法执行过程中的连接点。
- 构造函数执行:代表构造函数执行过程中的连接点。
- 字段访问:代表对类的字段进行访问的连接点。
- 初始化:代表类初始化过程中的连接点
通过理解和掌握这些概念和使用方法,可以实现更灵活、可维护和可扩展的代码结构,从而提高应用程序的质量和可靠性