SPRING AOP в pointcut не обрабатывается для заданного метода bean-компонента

Вкратце:

а) spring.xml

<aop:aspectj-autoproxy />

<bean id="circle" class="org.tutorial.spring.model.Circle">
    <property name="name" value="Circle name" />
</bean>

<bean id="triangle" class="org.tutorial.spring.model.Triangle">
    <property name="name" value="Triangle name" />
</bean>

<bean id="shapeService" class="org.tutorial.spring.service.ShapeService" autowire="byName" />

<bean class=" org.tutorial.spring.aspect.LoggingAspect" />

б) Класс ShapeService

package org.tutorial.spring.service;

import org.tutorial.spring.model.Circle;

public class ShapeService {

private Triangle triangle;
private Circle circle;

public Triangle getTriangle() {
    return triangle;
}

public void setTriangle(Triangle triangle) {
    this.triangle = triangle;
}

public Circle getCircle() {
    return circle;
}

public void setCircle(Circle circle) {
    this.circle = circle;
}

}

в) Класс кружка

package org.tutorial.spring.model;

public class Circle {

private String name;

public String getName() {
    System.out.println("Circle getName");
    return name;
}

public void setName(String name) {
    System.out.println("Circle setName");
    this.name = name;
}

}

г) класс LoggingAspect

@Aspect
public class LoggingAspect {

@Before("allCircleMethods()")
public void securityAdvice() {
    System.out.println("Security Advice is executed!");
}

@Pointcut("within(org.tutorial.spring.model.Circle)")
public void allCircleMethods() {
}

}

e) класс ShapeAOP (основной класс для запуска)

public class ShapeAOP {

public static void main(String[] args) {
    ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
    ShapeService shapeService = ctx.getBean("shapeService", ShapeService.class);
    System.out.println(shapeService.getCircle().getName());
}

}

ВЫХОД:

Круг setName
Совет по безопасности выполнен!
Круг getName
Имя круга

Обратите внимание на вывод, что во время создания экземпляра компонента Circle перед «Circle setName» не выполняется «Совет по безопасности».

Почему pointcut внутри класса Circle не применяется к методу Circle setName?


person yapkm01    schedule 19.02.2013    source источник
comment
Похоже, что pointcut не устанавливается до тех пор, пока bean-компонент не будет инициализирован. Что имеет смысл. Применение советов к bean-компонентам, которые еще не полностью сконструированы (т. е. в неопределенном состоянии), открывает всевозможные потенциальные проблемы. Пробовали ли вы явно вызывать свой метод setName() (например, в вашем main) только для того, чтобы убедиться, что совет применяется тогда?   -  person pap    schedule 19.02.2013
comment
@пап ты прав. Не имеет смысла, чтобы совет применялся во время создания экземпляра компонента. Я проверил это, и это подтверждает ваши выводы. Спасибо.   -  person yapkm01    schedule 19.02.2013


Ответы (1)


Пользователь pap ответил на мой вопрос в разделе комментариев

person yapkm01    schedule 19.02.2013