Spring Aop Pointcut выражений в других проектах не применяется - PullRequest
0 голосов
/ 09 февраля 2020

Структура проекта:

  1. spring-contract
  2. spring-aop как зависимость (1)
  3. spring-service как зависимость (2).

У меня есть аннотация параметров @MyAnnotation в spring-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 {
}

1 Ответ

0 голосов
/ 09 февраля 2020

В одном из ваших весенних конфигурационных классов добавьте @EnableAspectJAutoProxy. Это включит обработку аспектов в приложении весны.

    @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

...