Spring AOP切入点表达式

时间:2018-04-17 18:10:01

标签: java spring aop spring-aop pointcut

我正在尝试实现可以​​在我的应用程序中的多个包中应用的记录器方面。它是一个拥有许多模块的大型弹簧Web应用程序。每个模块都有自己的控制器,服务和DAO。我定义的切入点定位了包中每个类的所有公共方法。它是public * com.abc.module1.controllers.*.*(..)用于控制器,public * com.abc.module1.services.*.*(..)用于服务,public * com.abc.module1.daos.*.*(..)用于模块1中的DAO。我有大约30个这样的模块。所以问题是,要覆盖所有这些模块,我必须为每个模块定义切入点。所有模块都遵循相同的包结构。有没有办法可以指定切入点,它可以涵盖放置在不同模块中的所有controllersservices? Spring AOP是否允许包名中包含通配符?

1 个答案:

答案 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,你还需要将简单的切入点升级到上面的一个更明确的切入点。