我正在尝试实现可以在我的应用程序中的多个包中应用的记录器方面。它是一个拥有许多模块的大型弹簧Web应用程序。每个模块都有自己的控制器,服务和DAO。我定义的切入点定位了包中每个类的所有公共方法。它是public * com.abc.module1.controllers.*.*(..)
用于控制器,public * com.abc.module1.services.*.*(..)
用于服务,public * com.abc.module1.daos.*.*(..)
用于模块1中的DAO。我有大约30个这样的模块。所以问题是,要覆盖所有这些模块,我必须为每个模块定义切入点。所有模块都遵循相同的包结构。有没有办法可以指定切入点,它可以涵盖放置在不同模块中的所有controllers
,services
? Spring AOP是否允许包名中包含通配符?
答案 0 :(得分:1)
我建议阅读AspectJ documentation,例如
然后你不需要在这里问这样的问题。
无论如何,这是你如何解决你的问题(我正在添加换行符以提高可读性):
type Foo<T : BoundType> = {
bar : T
}
class Class<T : BoundType, F : Foo<T>> {
method(arg : T) { ... }
}
let x = new Class<ConcreteType, Foo<ConcreteType>>;
或者:
execution(public * com.abc..controllers..*(..)) ||
execution(public * com.abc..services..*(..)) ||
execution(public * com.abc..daos..*(..))
如果你使用Spring AOP而不是成熟的AspectJ,你可以使它更简单,因为Spring AOP基本上只知道(
within(com.abc..controllers..*) ||
within(com.abc..services..*) ||
within(com.abc..daos..*)
) &&
execution(public * *(..))
而没有其他切入点,如execution()
,构造函数执行,call()
/ set()
等。
get()
使用JDK动态代理(当组件实现接口时默认),这只会针对公共方法调用。使用CGLIB代理,它还可以针对受保护和包私有的代理。顺便说一下,如果你之后从Spring AOP迁移到AspectJ,你还需要将简单的切入点升级到上面的一个更明确的切入点。