自定义注解与AOP(面向切面编程)的结合常常用于在应用程序中划定切面,以便在特定的方法或类上应用横切关注点。以下是一个简单的示例,演示了如何创建自定义注解,并使用Spring AOP来在被注解的方法上应用通知。
如何创建自定义注解
创建注解
首先,创建一个自定义注解:
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface MyCustomAnnotation { String value() default ""; }
这个注解名为 MyCustomAnnotation,它可以标注在方法上,具有一个可选的字符串值。
创建切面
然后,创建一个切面类,定义通知,并使用切入点表达式匹配被 MyCustomAnnotation 注解标注的方法:
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect @Component public class MyAspect { @Before("@annotation(myCustomAnnotation)") public void beforeAdvice(MyCustomAnnotation myCustomAnnotation) { String value = myCustomAnnotation.value(); System.out.println("Before method execution with custom annotation. Value: " + value); } }
这个切面类使用了 @Before 注解,它的参数是一个切入点表达式 @annotation(myCustomAnnotation),表示在被 MyCustomAnnotation 注解标注的方法执行前执行。方法的参数 MyCustomAnnotation myCustomAnnotation 允许你获取到注解上的值。
最后,在你的服务类中使用 MyCustomAnnotation 注解:
import org.springframework.stereotype.Service; @Service public class MyService { @MyCustomAnnotation(value = "Custom Value") public void myMethod() { System.out.println("Executing myMethod"); } }
在这个例子中,MyService 类中的 myMethod 方法上标注了 MyCustomAnnotation 注解。当调用这个方法时,切面中的通知会在方法执行前输出相关信息。
这样,你就通过自定义注解和AOP结合的方式,实现了在特定方法上应用通知的需求。
使用切入点
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; @Aspect @Component public class MyAspect { // 定义切入点,匹配所有使用 @MyCustomAnnotation 注解的方法 @Pointcut("@annotation(com.example.demo.MyCustomAnnotation)") public void myCustomAnnotationPointcut() {} // 在切入点之前执行通知 @Before("myCustomAnnotationPointcut()") public void beforeAdvice() { System.out.println("Before method execution with custom annotation"); } }