Spring boot AOP Aspect не вызывается

Я пытаюсь перехватить вызовы остальных сервисов с аспектом следующим образом

 package mypackage.services.Service;

 @Component
 public class Service {

      @Override
      public Response helloService() {
        return handleResult("Hello test " + new Date());
      }
 }

@Component
@Aspect
public class AuditLog {

     @Before("execution(* mypackage.services.Service.*(..))")
     public void beforeServcie(JoinPoint jp){
       log.info("Before ",jp.getSignature().getName());
     }
}

Я использую следующие зависимости maven

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>4.3.6</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.8.10</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.10</version>
    </dependency>

Этот плагин maven

    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>aspectj-maven-plugin</artifactId>
      <version>1.0</version>
    </plugin> 

И моя конфигурация xml содержит

   <beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <context:component-scan base-package="mypackage"/>
    <aop:aspectj-autoproxy proxy-target-class="true" />

также в классе Application я добавил следующую аннотацию

  @Configuration
  @EnableAspectJAutoProxy(proxyTargetClass=true)
  public class Configuration{
   ...
  }

При запуске, регистрируя bean-компоненты в ApplicationContext, я вижу, что создается класс аспекта «AuditLog».

Я установил 2 точки останова, но отладчик не останавливается на методе «beforeServcie», а останавливается на «helloService».

Что мне не хватает?


person Ahadu Tsegaye Abebe    schedule 20.07.2017    source источник
comment
пытался, но не получилось   -  person Ahadu Tsegaye Abebe    schedule 20.07.2017
comment
вам не нужны все эти зависимости от аспектов   -  person René Winkler    schedule 20.07.2017
comment
почему у вас есть отдельная конфигурация xml?   -  person René Winkler    schedule 20.07.2017
comment
proxyTargetClass=true не требуется   -  person René Winkler    schedule 20.07.2017
comment
Какие зависимости лишние? Я удалил targetClass=True, но он все равно не проходит из метода Aspect   -  person Ahadu Tsegaye Abebe    schedule 20.07.2017


Ответы (2)


Попробуй это

execution(* mypackage.services.Service.*.*(..))

вместо

execution(* mypackage.services.Service.*(..))
person Karthik Tsaliki    schedule 20.07.2017
comment
если вы используете весеннюю загрузку, нет необходимости добавлять зависимости, config.xml и @EnableAspectJAutoProxy(proxyTargetClass=true) в класс конфигурации - person Karthik Tsaliki; 20.07.2017
comment
Если я удаляю зависимости (например, spring-aop, aspectjrt), я получаю ошибки компиляции в аннотациях «@Aspect», «@AfterReturning» и «@Before». - person Ahadu Tsegaye Abebe; 20.07.2017

  1. Если вы используете spring-boot, вместо автоматического добавления банок зависимостей вы можете сделать

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    
  2. Если вы используете XML-конфигурацию <aop:aspectj-autoproxy ... />, то нет необходимости иметь @EnableAspectJAutoProxy. Вероятно, это не имеет значения, поскольку конфигурация AFAIK XML выигрывает у конфигурации аннотаций, но лучше избегать дублирования.

  3. Я не совсем уверен, зачем вам нужен aspectj-maven-plugin, поскольку Spring реализует AOP через прокси, и, насколько мне известно, этот плагин нужен только для времени компиляции, времени пост-компиляции или времени загрузки, которые являются разными концепциями, см. Spring AOP против AspectJ

Теперь все вышеупомянутые пункты могут не решить вашу проблему, но следующее может

execution(* mypackage.services.Service.Service.*(..))

И не устанавливайте proxyTargetClass=true, пусть по умолчанию будет false.

Пояснение

Формат execution(<return type> <package name>.<class name>.<method name>(..)

Имя пакета здесь — mypackage.services.Service, а имя класса — Service.

person Satrajit A    schedule 08.05.2021
comment
Спасибо за ответ спустя 3 года. Я удалил proxyTargetClass=true из конфигурации и использовал @Before(execution(* mypackage.services.Service.*(..))), но не повезло :( - person Ahadu Tsegaye Abebe; 10.05.2021
comment
@AhaduTsegayeAbebe, вы сказали, что пытались mypackage.services.Service.*, но было предложено mypackage.services.Service.Service.* - person Satrajit A; 11.05.2021
comment
извините, я забыл упомянуть, что исправил пакет на «mypackage.services;» - person Ahadu Tsegaye Abebe; 11.05.2021