Можно ли сплести аспект в динамически создаваемый класс? - PullRequest
3 голосов
/ 21 апреля 2011

Я использую Spring, и у меня есть аспект, охватывающий некоторый класс:

@Aspect
public class LoggingAspect{

    @Around("execution(public * com.service.MyService.doStuff(..))")
    public Object log(){
        ...
    }
}

и в контексте xml:

<aop:aspectj-autoproxy/>
<bean id="loggingAspect" class="com.bla.bla.bla.LoggingAspect"/>

Проблема в том, что создаются экземпляры MyServiceво время выполнения, поэтому Spring ничего не знает об этом классе на этапе инициализации контекста.Можно ли в этом случае использовать аспекты для переноса вызовов методов класса, созданного с использованием new (не Spring)?

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

Если мое чтение Spring docs правильное, вы делаете это так (для ткачества на основе прокси Spring):

ProxyFactory factory = new ProxyFactory(new SimplePojo());
factory.addInterface(Pojo.class);
factory.addAdvice(new RetryAdvice());

Pojo pojo = (Pojo) factory.getProxy();

или как это (для AspectJ-стиля)ткачество):

AspectJProxyFactory factory = new AspectJProxyFactory(new SimplePojo()); 
factory.addAspect(new RetryAspect());

Pojo proxy = factory.getProxy();

(я провожу все свои ткачества AOP через конфигурацию бобов, поэтому мне не нужно использовать подобные вещи на практике.)

1 голос
/ 21 апреля 2011

Нет, вы можете использовать Spring AOP только для консультирования Spring bean-компонентов (потому что Spring создает прокси-объект за кулисами). Вам придется использовать полный AspectJ или создать свой MyService в контейнере Spring. Смотри http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-choosing.

...