Spring AOP - @AfterReturning не работает

У меня есть метод Java, getAllItems(), и я создал метод аспекта, который вызывается после завершения getAllItems().

@Repository
@Scope("prototype")
public class ItemDao {
    // not using database connection for this question; the program works fine, except aspects
    public List<String> getIAllItems() {
        List<String> items = new ArrayList();
        items.add("item1");
        return items;
    }
}

Класс аспекта таков:

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import java.util.List;

@Aspect
public class MyAspects {

    @AfterReturning(pointcut = "execution(* ro.telacad.dao.ItemDao.getIAllItems(..))", returning="items")
    public void afterGetAllItems(List<String> items) {
        System.out.println(items);
    }
}

Итак, после вызова getAllItems() я ожидаю увидеть в консоли напечатанное «[item1]», но метод аспекта не вызывается. Ошибки в консоли нет, а приложение, кроме аспектов, работает нормально. Итак, я считаю, что все весенние бобы созданы.

В appConfig.xml bean-компоненты объявлены следующим образом:

<context:component-scan base-package="ro.telacad.*" />
<aop:aspectj-autoproxy/>

Мой вопрос в том, что я сделал неправильно для аспектов.


person Catalin Vladu    schedule 15.10.2019    source источник


Ответы (1)


MyAspects не обнаруживается при сканировании компонентов Spring, поскольку у него нет аннотации @Component, а также @Aspect. @Repository делает есть аннотация.

Либо добавьте аннотацию @Component к MyAspects, либо явно объявите bean-компонент в своей конфигурации XML:

<bean id="myAspects" class="com.yourpackage.MyAspects">
...
</bean>
person Michiel    schedule 20.10.2019