我想创建一个切入点表达式来拦截对com.xmy.package包及其子包中所有类的所有方法调用。我的xml,代码如下所示
<aop:config>
<aop:pointcut id="allCalls" expression="within(com.xmy.package..*)" />
<aop:aspect ref="loggingService">
<aop:around method="logMethodFlow" pointcut-ref="allCalls" />
</aop:aspect>
</aop:config>
引起:org.springframework.aop.framework.AopConfigException:无法生成类的CGLIB子类...... .. 。 。 。 。 .Caused by:java.lang.IllegalArgumentException:Superclass没有null构造函数但没有给出参数 at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:721) at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:499) at net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33) at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216) at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377) 在net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285) 在org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:201)
但是当我为特定类使用切入点表达式时(如下所示),它可以正常工作。
<aop:config>
<aop:pointcut id="classCalls" expression="execution(* com.xmy.package.MyClass.*(..))" />
<aop:aspect ref="loggingService">
<aop:around method="logMethodFlow" pointcut-ref="classCalls" />
</aop:aspect>
</aop:config>
请告诉我如何将所有方法调用记录到特定软件包及其子软件包。
答案 0 :(得分:0)
针对特定包及其子包中的所有方法调用的切入点。例如
com.xmy.package1.subpackages
...
com.xmy.package2.subpackages
...
<aop:config>
<aop:pointcut id="pkg1AllCalls" expression="execution (* com.xmy.package1+*())" />
<aop:pointcut id="pkg2AllCalls" expression="execution (* com.xmy.package2+*())" />
<aop:aspect ref="loggingService">
<aop:around method="logMethodFlow" pointcut-ref="pkg1AllCalls" />
<aop:around method="someOtherMethod" pointcut-ref="pkg2AllCalls" />
</aop:aspect>
</aop:config>
即。定义2个不同的切入点,使表达式既简洁又可维护。 注意 someOtherMethod()
是我添加新内容以使用两个不同的切入点。
基于XML的样式存在限制如果必须合并两个切入点,如上所示ref:6.4.2 Spring Docs 3.0的部分
然而,当用作@AspectJ
时,这很容易实现@Pointcut(execution(* get*()))
public void propertyAccess() {}
@Pointcut(execution(org.xyz.Account+ *(..))
public void operationReturningAnAccount() {}
@Pointcut(propertyAccess() && operationReturningAnAccount())
public void accountPropertyAccess() {}