Аспекты не выполнены - PullRequest
2 голосов
/ 07 марта 2012

Я пытаюсь проверить простой аспект.Приложение компилируется и работает нормально, НО я не выполняю Аспект.Или, по крайней мере, я не получаю вывод, который должен производить аспект.(Моя цель состоит в том, чтобы написать регистратор исключений для любого ex, который происходит в приложении. Но сначала этот аспект теста должен быть запущен ...)

Может быть, кто-то, кто имеет больше опыта в аспектах, видит, что я делаю неправильно?

package business;
public interface Customer {
    void addCustomer();
}

import org.springframework.stereotype.Component;
@Component
public class CustomerImpl implements Customer {

    public void addCustomer() {
        System.out.println("addCustomer() is running ");
    }
}



@RequestScoped @Named
//this is backing bean for jsf page
public class Service {

     @Inject
     Customer cust;

    add() {
        System.out.println("Service is running ");
        cust.addCustomer();
    }
}


@Aspect
public class AspectComp {
    @Before("within(business..*)")
    public void out() {
     System.out.println("system out works!!");
 }
}

Spring:

<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    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/aop
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    ">

    <context:annotation-config />
    <context:component-scan base-package="business" />

    <aop:aspectj-autoproxy />
</beans>

Вывод:

Service is running 
addCustomer() is running 

Отсутствует оператор Aspect.

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Вы создаете свой Компонент с его конструктором, а не получаете его из контейнера Spring! В этом проблема, или вы должны использовать ткач AspectJ во время загрузки.

Просто внедрите свой компонент (CustomerImpl) в ваш сервис, а затем используйте внедренный экземпляр.

0 голосов
/ 08 марта 2012

Я помню, как однажды сталкивался с подобной проблемой; Spring фактически не загружал прокси-сервер, поскольку не распознавал аннотацию @Aspect как bean-объект, сканируемый аннотацией. Я добавил аннотацию @Component в нотацию @Aspect, и Spring начал ее сканирование.

Я никогда не изучал причины, по которым это произошло, и почему я должен был это сделать, поэтому я не могу подтвердить, что это «правильный» способ ведения дел. Моя интуиция сказала бы, что в моем конфигурационном файле чего-то не хватает; Я не могу себе представить, почему Spring не будет сканировать бины @Aspect.

Еще одна вещь, которую вы можете сделать, это явно объявить ваш компонент Aspect в файле конфигурации XML, чтобы увидеть, если это такая же проблема, как у вас.

Вы также можете включить ведение журнала отладки в среде Spring и посмотреть, загружается ли ваш компонент в Spring. Если нет, то это дает вам представление, с чего начать.

...