我尝试在这个站点中运行一个简单的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不包含"调用",但为什么aspectj编织不起作用,你有想法吗?非常感谢。
编辑:
在我的spring-config文件中,我只有@saspect注释类和<aop:aspectj-autoproxy />
的bean定义。我的罐子是:spring-op-3.0.5,aopalliance,aspectjrt1.6.8,aspectjweaver1.50
您是否尝试过使用AspectJ Eclipse插件进行编织?(它也包含在SpringSource工具套件中(
如果您的Spring配置中有一些方面配置。试着删除它,只在项目中启用AspectJ性质。还要删除所有AspectJjar文件,只使用插件自动附加的文件。
有了这个设置,它至少对我有效。
更新:将方面建议编织到代码中
由于您的调用切入点,您从Spring容器中得到了一个异常。但是你想要AspectJ编织这个方面。然后,您需要使用编译时编织或加载时编织。编译时编织是插件提供的最简单的替代方案。
您可以将AspectJ编译器看作是一个高级Java编译器,它也支持AspectJ。因此,您可以在任何地方运行编译后的代码。
此外,您不需要该插件进行编译。例如,您可以使用Ant任务进行编译,正如我在这里展示的那样。
但最简单的选择是使用插件。这也为您提供了额外的帮助,我在这里简要介绍了这些帮助。
我希望这能有所帮助!