0

项目结构为

  1. spring-contract
  2. spring-aop作为 (1) 的依赖项
  3. spring-service作为(2)的依赖。

@MyAnnotationspring-contract项目中有一个参数注释,一个方面类spring-aop

package com.learning.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class AnnotatedFieldAspect {

    @Before("execution(* *(.., @MyAnnotation (*), ..)) && args(newValue)")
    public void advice(JoinPoint jp, Object newValue) {
        System.out.println(">>> inspecting "+newValue+" on "+jp.getTarget()+", "+jp.getSignature());
    }
}

注释将建议的类在spring-service项目中,

package com.learning.fieldtest.service;

public class TestField {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(@MyAnnotation String name) {
        this.name = name;
    }

    public static void main(String[] args) {
        TestField testField = new TestField();
        testField.setName("Alex");
        testField.m1(testField.getName());
        System.out.println(testField.getName());
    }

    public void m1(@MyAnnotation String string) {
        System.out.println("Inside m1() @MyAnnotation" + string);
    }
}

类 TestField 方法未标记为建议,如果我移动同一个包中的所有类,我会得到结果。还有其他方面是在类和方法级别编写的,正在得到应用。

>>> inspecting Alex on com.learning.fieldtest.service.TestField@3fa77460, void com.learning.fieldtest.service.TestField.setName(String)
>>> inspecting Alex on com.learning.fieldtest.service.TestField@3fa77460, void com.learning.fieldtest.service.TestField.m1(String)
Inside m1() @MyAnnotationAlex
Alex

自定义注释

package com.learning.spring.contract;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface MyAnnotation {
}
4

1 回答 1

0

在您的一个弹簧配置类中添加@EnableAspectJAutoProxy。这将启用 spring 应用程序中的方面处理。

    @Configuration
    @EnableAspectJAutoProxy
     public class AppConfig {

         @Bean
         public FooService fooService() {
             return new FooService();
         }

         @Bean
         public MyAspect myAspect() {
             return new MyAspect();
         }
     }

有关更多详细信息,请参阅:https ://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/EnableAspectJAutoProxy.html

于 2020-02-09T03:08:50.563 回答