Spring AOP - Как предотвратить нацеливание на производные классы - PullRequest
2 голосов
/ 24 ноября 2011

У меня есть базовый класс с несколькими производными классами, которые расширяют его. Я хочу ограничить свой Spring AOP Aspect только суперклассом, чтобы прокси-сервер AOP создавался только для него, а не для производных классов.

Я попытался определить pointcut следующим образом:

@Pointcut("execution(* com.blah.platform.persistence.generic.GenericDaoImpl.*(..))")
public void withinGenericDao() {}

где GenericDaoImpl является суперклассом.

Я до сих пор вижу, что прокси также генерируются для производных классов:

2011-11-24 18:00:28,616 ContainerBackgroundProcessor[StandardEngine[Catalina]] DEBUG [JdkDynamicAopProxy] Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [com.blah.admin.persistence.impl.CircuitDAOImpl@5c81cf46]
2011-11-24 18:00:28,638 ContainerBackgroundProcessor[StandardEngine[Catalina]] DEBUG [JdkDynamicAopProxy] Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [com.blah.admin.persistence.impl.CategoryDAOImpl@55eef3c1]
2011-11-24 18:00:28,645 ContainerBackgroundProcessor[StandardEngine[Catalina]] DEBUG [JdkDynamicAopProxy] Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [com.blah.admin.services.circuit.impl.CircuitsServiceImpl@d50112d]
2011-11-24 18:00:28,953 ContainerBackgroundProcessor[StandardEngine[Catalina]] DEBUG [JdkDynamicAopProxy] Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [com.blah.events.persistence.impl.EventsDAOImpl@4222023a]
2011-11-24 18:00:29,030 ContainerBackgroundProcessor[StandardEngine[Catalina]] DEBUG [JdkDynamicAopProxy] Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [com.blah.events.persistence.impl.PrototypesDAOImpl@d3bef50]

Я бы подумал, что это должно произойти только тогда, когда pointcut определяется следующим образом:

execution(public * com.mycompany.myservice.MyService+.*(..))

Есть идеи?

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

Можете ли вы изменить определение PointCut с execution на within?Я имел успех с этим в прошлом.(Обратите внимание, что синтаксис немного отличается. Подробнее см. Справочную документацию Spring AOP.)

например, @PointCut("within(com.blah.platform.persistence.generic.GenericDaoImpl)")

0 голосов
/ 26 июня 2013

Подкласс наследует открытые методы и свойства родительского класса, включая ваши аннотации.

...