springBoot中aop获取对象包括引用对应的所有字段上的注解java代码
时间: 2024-03-08 20:46:53 浏览: 105
【数据脱敏方案】不使用 AOP + 注解,使用 SpringBoot+YAML 实现
好的,这是一个例子,展示了如何在Spring Boot中使用AOP获取对象及其引用的所有字段上的注解:
首先,我们需要一个自定义注解`@MyAnnotation`:
```java
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
public @interface MyAnnotation {
String value() default "";
}
```
然后,在需要被AOP处理的类或方法上添加`@MyAnnotation`注解:
```java
@MyAnnotation
public class UserController {
@MyAnnotation
private UserService userService;
// other fields and methods
}
```
接着,我们创建一个切面类`MyAspect`,用于处理`@MyAnnotation`注解:
```java
@Aspect
@Component
public class MyAspect {
@Pointcut("@annotation(com.example.demo.MyAnnotation)")
public void myPointcut() {}
@Around("myPointcut()")
public Object myAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
Object target = joinPoint.getTarget();
Field[] fields = target.getClass().getDeclaredFields();
for (Field field : fields) {
MyAnnotation annotation = field.getAnnotation(MyAnnotation.class);
if (annotation != null) {
System.out.println("Found MyAnnotation on field: " + field.getName());
// do something with the annotation
}
}
return joinPoint.proceed();
}
}
```
在`MyAspect`中,我们定义了一个切点`myPointcut`,用于匹配所有被`@MyAnnotation`注解的类或方法。然后,我们在`myAdvice`方法中,使用反射机制获取目标对象`target`,以及`target`引用的所有字段`fields`。在遍历`fields`的过程中,我们使用`field.getAnnotation(MyAnnotation.class)`方法获取字段上的`@MyAnnotation`注解,如果该注解存在,则说明该字段需要被处理。
最后,在Spring Boot应用程序中,将`MyAspect`类注册为一个Bean,以便AOP能够识别并应用它:
```java
@SpringBootApplication
@EnableAspectJAutoProxy
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
public MyAspect myAspect() {
return new MyAspect();
}
}
```
这样,当我们运行Spring Boot应用程序时,AOP就会自动识别`MyAspect`类,并在所有匹配到的类或方法上执行`myAdvice`方法。
阅读全文