我尝试在this网站中运行一个简单的aop示例。我有spring aop和aspectj,aspectjweaver jars:
@Aspect
public class StringAspect {
@Pointcut("call(* String.toLowerCase())")
public void toLowerCasePointcut() {}
@Around("toLowerCasePointcut()")
public String toLowerCaseAroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
String text = ((String) joinPoint.getTarget()).toUpperCase();
return text;
}
}
当我在Test.java中运行此示例时,如“AaBbCc”.toLowerCase(),我得到此异常;
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean ... Initialization of bean failed; nested exception is org.aspectj.weaver.tools.UnsupportedPointcutPrimitiveException: Pointcut expression call(* String.toLowerCase()) contains unsupported pointcut primitive 'call'
Spring AOP不包含“call”,但是为什么aspectj编织不起作用,你有什么想法吗?谢谢。
编辑:
在我的spring配置文件中,我只有@aspect注释类和<aop:aspectj-autoproxy />
的bean定义。
我的罐子是:spring-aop-3.0.5,aopalliance,aspectjrt1.6.8,aspectjweaver1.5.0
答案 0 :(得分:2)
您是否尝试使用AspectJ Eclipse plugin进行编织? (它也包含在SpringSource Tool Suite)
中如果在Spring配置中有一些方面配置。尝试删除它,只在项目中启用AspectJ性质。同时删除所有AspectJ jar文件,仅使用插件自动附加的文件。
通过这种设置,它至少对我有用。
更新:将方面建议编入代码
由于您的调用切入点,您从Spring容器中获得异常。但是你想要AspectJ weavingweave方面。然后,您需要使用编译时或加载时编织。编译时编织是插件提供的替代方案中最简单的替代方案。
您可以将AspectJ编译器视为也支持AspectJ的高级Java编译器。所以你可以在任何地方运行编译代码。
此外,您不需要编译插件。例如,您可以使用Ant任务进行编译,因为我已经显示here。
但最简单的选择是使用插件。这也为我提供了额外的帮助,我简要介绍了here。
我希望这有帮助!