Spring AOP: совет не срабатывает - PullRequest
2 голосов
/ 12 октября 2011

Попытка разработать простой аспект, который будет выводить слово «logg» на консоль, когда выполняется какой-либо из открытых методов.

аспект:

@Aspect
public class LoggingAspect {

    @Pointcut("execution(public * *(..))")
    public void publicServices() {
    };

    @Before("publicServices()")
    public void logg() {
        System.out.println("logg");
    }

}

xml config :

    <context:component-scan base-package="aspectlogging" /> 
    <aop:aspectj-autoproxy/>
    <bean id="loggingAspectHolder" class="aspectlogging.LoggingAspect"/>

простой боб:

package aspectlogging;
@Component
    public class TestableBean {

        private String name;

        public String getName() {
            return name;
        }

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

тест:

public class TestLogging {
    public static void main(String[] args) {
        TestableBean tb = new TestableBean();
        tb.setName("yes");
        tb.getName();
    }
}

Я ожидаю, что результатом выполнения TestLogging будет слово " logg " в консоли, и никакого вывода не будет возвращено. Правильно ли я понимаю АОП в этом случае?

Ответы [ 2 ]

5 голосов
/ 12 октября 2011

При использовании @Around advice вам необходимо иметь аргумент ProceedingJoinPoint pjp для метода advising и вызывать pjp.proceed() в той точке советника, когда вы хотите, чтобы вызывался упакованный метод.На самом деле проще использовать @Before рекомендацию, когда то, что вы сделали, будет работать нормально.


[EDIT]: Кроме того, вы должны позволить Spring создать ваши бинывместо того, чтобы напрямую звонить new.Это потому, что объект bean на самом деле является прокси для вашего реального объекта (который находится внутри него).Поскольку ваш целевой объект не реализует интерфейс, вам необходимо иметь библиотеку cglib на вашем пути к классам в дополнение к библиотекам Spring.(В качестве альтернативы вы можете полностью использовать AspectJ, но для этого требуется использовать другую конфигурацию компилятора.)

Чтобы создать компоненты, сначала нужно создать контекст Spring , а затем запроситьдля экземпляра бина.Это означает, что вы изменяете с:

TestableBean tb = new TestableBean();

на (при условии, что вы используете Spring 3 и что ваш XML-конфиг находится в "config.xml" где-то на вашем пути к классам):

ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
TestableBean tb = context.getBean(TestableBean.class);

Остальная часть вашего кода остается прежней (после корректировки операторов import и, возможно, дополнительных зависимостей).

4 голосов
/ 12 октября 2011

Не совсем уверен в этом, но, возможно, вам нужно использовать управляемый пружиной TestableBean, чтобы Spring AOP принимал вызов метода.

edit: конечно, вы не можете использовать @Aroundкак вы указали - но этот вопрос был рассмотрен в другом ответе, поэтому здесь он опущен.

edit2: Если вам нужна помощь в получении пружинного боба, пожалуйста, не стесняйтесь спрашивать.но так как вы уже настроили свой аспектный компонент, я думаю, вы справитесь с этим:)

edit3: Хе-хе.Хорошо, а может и нет:)

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

загрузит контекст вашего приложения.Загрузите бины оттуда, вызвав:

TestableBean testableBean = (TestableBean )ctx.getBean("testableBean ");

Определите TestableBean так же, как вы делали это с вашим компонентом Aspect.

edit4: Теперь я почти уверен, что ошибка неВесенний управляемый боб

Use the simplest thing that can work. Spring AOP is simpler than using full AspectJ as there is no requirement to introduce the AspectJ compiler / weaver into your development and build processes. If you only need to advise the execution of operations on Spring beans, then Spring AOP is the right choice. If you need to advise domain objects, or any other object not managed by the Spring container, then you will need to use AspectJ.

Взято из: http://static.springsource.org/spring/docs/2.0.x/reference/aop.html

...