2

我正在尝试设置 Spring AoP 框架并且我不想依赖 AspectJ,所以我在 bean xml 配置文件中声明了我的方面、建议等,类似于以下内容:

<bean id="systemAuthorizationsAspect" class="com.cp.pm.systemsettings.SystemAuthorizationsAspect" >
    <property name="sysAuthorizations" ref="authorizations" />
</bean>
<bean id="authorizations" class="com.hp.cp.pm.systemsettings.SystemAuthorizationsImpl">
    <property name="authSettingsRegistry" ref="systemSettingsRegistry" />
</bean>
<aop:config>
    <aop:aspect id="createPlanAspect" ref="systemAuthorizationsAspect">
         <aop:before pointcut="execution(* com.hp.cp.web.api.plan.PlanApi.createPlan(..))" method="authorizePlanCreation"/>
    </aop:aspect>
</aop:config>

每当我指定如上所示的切入点时,我都会收到以下错误:

BeanPostProcessor before instantiation of bean failed; 
nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0': 
Cannot create inner bean '(inner bean)' of type [org.springframework.aop.aspectj.AspectJMethodBeforeAdvice] while setting constructor argument; 
nested exception is org.springframework.beans.
factory.BeanCreationException: 
Error creating bean with name '(inner bean)': 
Cannot create inner bean '(inner bean)' of type [org.springframework.aop.aspectj.AspectJExpressionPointcut] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name '(inner bean)': 
Instantiation of bean failed; nested exception is **java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException**

当我包含 aspectjweaver.jar 时,我可以完成这项工作。然而,这不应该是这样的。有什么想法吗?

提前致谢

4

2 回答 2

5

请参阅 Spring 文档启用 @AspectJ 支持

可以使用 XML 或 Java 样式配置启用 @AspectJ 支持。在任何一种情况下,您还需要确保 AspectJ 的 aspectjweaver.jar 库位于应用程序的类路径中(版本 1.6.8 或更高版本)。

当然,如果您想使用 aspectj 提供的功能,您将需要一些 aspectj 库。但是我想在运行时将它放在类路径上就足够了,因此您的项目不一定对这个 jar 有编译时依赖。

于 2013-05-15T15:18:37.737 回答
2

要使其在不依赖 AspectJ 的情况下工作,切入点不能使用 ApsectJ 表达式语言。

例如,从 zagyi 提供的链接中,以下代码具有使用 AspectJ 表达式语言声明的切入点:

<aop:config>
    <aop:aspect id="myAspect" ref="aBean">
    <aop:pointcut id="businessService"
      expression="execution(* com.xyz.myapp.service.*.*(..))"/>
</aop:aspect>

下一个代码块是普通的普通 Spring AoP:

<aop:config>
<aop:pointcut id="businessService"
    expression="com.xyz.myapp.SystemArchitecture.businessService()"/>
</aop:config>

我的新问题是查找有关预期语法的任何文档。应该有返回类型吗?参数?ETC?

于 2013-05-16T20:09:15.733 回答