使用注解的AOP编程
当注解没有参数时
当使用注解进行面向切面编程(AOP)时,你可以按照以下步骤来实现:
步骤:
1. 创建自定义注解:
首先,创建自定义的注解,以便在代码中标记需要进行横切操作的方法或类。
import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyCustomAnnotation {// 定义注解的属性(可选)
}
2. 创建切面类:
创建一个切面类,在切面类中定义相应的通知(advice),如 @Before
、@After
、@Around
等,以及指定切入点表达式来匹配需要执行横切逻辑的位置。
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;@Aspect
@Component
public class MyAspect {@Around("@annotation(com.example.MyCustomAnnotation)")public Object myAdvice(ProceedingJoinPoint joinPoint) throws Throwable {// 执行目标方法前的逻辑// 可以获取特定注解的信息,执行额外操作Object result = joinPoint.proceed(); // 执行目标方法// 执行目标方法后的逻辑// 可以处理目标方法执行后的结果或执行其他操作return result;}
}
3. 将切面类注册为 Spring Bean:
确保切面类被 Spring 容器管理,这样它才能够被应用到目标类的方法上。
4. 在目标类或方法上使用自定义注解:
@MyCustomAnnotation
public void myMethod() {// 这个方法会被切面拦截并执行 MyAspect 中定义的 myAdvice 方法的逻辑// 可以在此方法中定义业务逻辑
}
5. 运行程序:
确保 Spring 应用程序能够正常启动,并且切面逻辑能够被成功应用于被标记的方法或类中。
总结:
使用注解的 AOP 编程主要步骤包括:定义自定义注解,创建切面类并编写相应的通知方法和切入点表达式,将切面类注册为 Spring Bean,并在需要的目标方法或类上使用自定义注解。这样,切面类中定义的逻辑就可以在被标记的方法或类执行时生效,实现横切关注点的操作。
当注解有参数要获取里面的参数时
当使用注解进行面向切面编程(AOP)时,如果需要操作注解中的参数,可以按照以下步骤进行:
步骤:
1. 创建自定义注解:
首先,创建自定义的注解,并在注解中定义所需的属性,以便在被标记的方法或类中使用。
import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyCustomAnnotation {String value(); // 添加需要的参数
}
2. 创建切面类:
创建一个切面类,在切面类中定义相应的通知(advice),同时通过方法参数获取注解中的属性值。
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.AnnotationUtils;@Aspect
@Component
public class MyAspect {@Around("@annotation(myAnnotation)") // 通过参数获取注解public Object myAdvice(ProceedingJoinPoint joinPoint, MyCustomAnnotation myAnnotation) throws Throwable {String annotationValue = myAnnotation.value(); // 获取注解中的属性值// 执行目标方法前的逻辑// 可以使用注解中的属性值执行额外操作Object result = joinPoint.proceed(); // 执行目标方法// 执行目标方法后的逻辑// 可以处理目标方法执行后的结果或执行其他操作return result;}
}
代码中能够直接用@Around(“@annotation(myAnnotation)”) 的原因介绍:
在这段代码中,
@Around("@annotation(myAnnotation)")
表达式使用了 AspectJ 的切入点表达式,其中@annotation()
是用于匹配带有特定注解的方法的一种方式。这个表达式告诉切面,当被拦截的方法上存在指定的myAnnotation
注解时,应该执行横切逻辑。在这里,
@Around
注解中的@annotation(myAnnotation)
表达式中的myAnnotation
是作为参数传入myAdvice
方法的,表示该方法参数中的特定注解实例。AspectJ 允许使用
@annotation()
来匹配带有特定注解的方法。当执行被切入点所匹配的方法时,切面会拦截该方法并执行myAdvice
方法中定义的逻辑,同时允许通过joinPoint.proceed()
执行原始方法。在执行时,AspectJ会检查被拦截的方法上是否存在
myAnnotation
注解,并在满足条件时执行myAdvice
中的逻辑。这样你可以在方法执行前后做一些额外的操作,例如权限校验、日志记录等。简单来说就是原来对注解的匹配变成了从方法参数中取这个注解的定义了。
3. 将切面类注册为 Spring Bean:
确保切面类被 Spring 容器管理,这样它才能够被应用到目标类的方法上。
4. 在目标类或方法上使用自定义注解,并传递参数:
@MyCustomAnnotation(value = "someValue")
public void myMethod() {// 这个方法会被切面拦截并执行 MyAspect 中定义的 myAdvice 方法的逻辑// 可以在此方法中定义业务逻辑
}
总结:
- 定义自定义注解:在注解中添加需要的参数。
- 创建切面类:使用
@Around
或其他通知注解,在方法签名中加入注解类型的参数,通过该参数获取注解中的属性值。 - 将切面类注册为 Spring Bean:确保切面类被 Spring 容器管理。
- 在目标方法或类上使用自定义注解:使用自定义注解并传递所需的参数,这样切面就能够获取并操作注解中的参数信息。