请教:使用spring2.0 @AspectJ注解风格进行AOP编程时遇到问题:传递参数到Advice失败。
曾经按照spring2.0-reference-cn的说明试过多次,就是不行,郁闷。
我使用spring2.0,在进行aop应用是使用的是AspectJ 5注解风格
问题:想传递参数到Advice中,但是运行时失败,总是报错,错误stack在最后。
场景:
1. IDE: Eclipse3.2 + MyEclipse5.1, JDK1.5.7
lib: spring.jar(spring2.0),spring-aspects.jar, aspectjrt.jar, aspectjweaver.jar, aopalliance.jar
2. applictationContext-service.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!--业务逻辑,将要被切入的target-->
<bean id="nameParams" class="com.server.aspect.NameParams" />
<!--启用spring @AspectJ支持-->
<aop:aspectj-autoproxy/>
<!-- Advice: After Returning Advice Type -->
<bean id="afterReturnNameParms" class="com.server.aspect.AfterReturnNameParams" />
</beans>
3. Business Service: com.server.aspect.NameParams
public class NameParams {
//很简单,只是组合一下名称
public String compositeName(String name) {
String result = "---------> " + NameParams.class.getName() + ": " + name;
System.out.println(result);
return result;
}
4. AfterReturning Advice: com.server.aspect.AfterReturnNameParams
出问题的疑点
@Aspect
public class AfterReturnNameParams {
/**
* 我曾经试过这种写法:
* @AfterReturning(pointcut="execution(* com.server.aspect.NameParams.compositeName(..))", argsNames="name")
* 也不行
*/
@AfterReturning("execution(* com.server.aspect.NameParams.compositeName(..)) && " + "args(name)")
public void doAfter(Joinpoint joinpoint, String name) {
String result = "-------------->after returning advice: " + name;
System.out.println(result);
}
}
5. 调用者Client: com.server.aspect.MyClient
public class MyClient{
private ApplicationContext appContext;
public MyClient() {
String[] paths = new String[] { "/applicationContext-hibernate.xml",
"/applicationContext-service.xml" };
appContext = new ClassPathXmlApplicationContext(paths);
}
//执行业务:组合名称
public void doTest() {
NameParams nameParams = (NameParams) appContext.getBean("nameParams");
nameParams.compositeName("spring aspectj");
}
public static void main(String[] args) {
new MyClient().doTest();
}
}
6. 执行MyClient, 结果提示如下错误:
错误堆栈比较多,但是错误不是"dataSource"(第一行中: Error creating bean with name 'dataSource')引起的
"Caused by...."后面是错误源。
因为如果我不传递参数到Advice中,则一切OK.
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [applicationContext-hibernate.xml]: Initialization of bean failed; nested exception is java.lang.AbstractMethodError: org.springframework.core.LocalVariableTableParameterNameDiscoverer$FindMethodParamNamesClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
Caused by: java.lang.AbstractMethodError: org.springframework.core.LocalVariableTableParameterNameDiscoverer$FindMethodParamNamesClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at org.springframework.core.LocalVariableTableParameterNameDiscoverer.visitMethod(LocalVariableTableParameterNameDiscoverer.java:100)
at org.springframework.core.LocalVariableTableParameterNameDiscoverer.getParameterNames(LocalVariableTableParameterNameDiscoverer.java:50)
at org.springframework.core.PrioritizedParameterNameDiscoverer.getParameterNames(PrioritizedParameterNameDiscoverer.java:54)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.bindArgumentsByName(AbstractAspectJAdvice.java:370)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.calculateArgumentBindings(AbstractAspectJAdvice.java:331)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.afterPropertiesSet(AbstractAspectJAdvice.java:297)
at org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory.getAdvice(ReflectiveAspectJAdvisorFactory.java:216)
at org.springframework.aop.aspectj.annotation.InstantiationModelAwarePointcutAdvisorImpl.instantiateAdvice(InstantiationModelAwarePointcutAdvisorImpl.java:145)
at org.springframework.aop.aspectj.annotation.InstantiationModelAwarePointcutAdvisorImpl.<init>(InstantiationModelAwarePointcutAdvisorImpl.java:96)
at org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory.getAdvisor(ReflectiveAspectJAdvisorFactory.java:140)
at org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory$1.doWith(ReflectiveAspectJAdvisorFactory.java:79)
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:191)
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:168)
at org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory.getAdvisors(ReflectiveAspectJAdvisorFactory.java:75)
at org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator.createAspectJAdvisors(AnnotationAwareAspectJAutoProxyCreator.java:178)
at org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator.findCandidateAdvisors(AnnotationAwareAspectJAutoProxyCreator.java:129)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:68)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:54)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:247)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:311)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1038)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:420)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:141)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:156)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:290)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:348)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:92)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:77)
at com.server.aspect.MyClient.<init>(MyClient.java:24)
at com.server.aspect.MyClient.main(MyClient.java:33)
7.运行成功的写法:不传递参数到Advice。(其它配置及代码不变)
AfterReturning Advice: com.server.aspect.AfterReturnNameParams
@Aspect
public class AfterReturnNameParams {
@AfterReturning("execution(* com.server.aspect.NameParams.compositeName(..))")
public void doAfter(Joinpoint joinpoint) {
String result = "-------OK------->after returning advice";
System.out.println(result);
}
}
请大家帮助,谢谢。
分享到:
相关推荐
在微服务流行的当下,在使用Spring Cloud / Spring Boot框架开发中,AOP使用的非常广泛,尤其是@Aspect注解方式当属最流行的,不止功能强大,性能也很优秀,还很舒心!所以本系列就结合案例详细介绍@Aspect方式的切...
6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个...
里面包括4个例子:(1)Spring实现AOP方式之一:基于XML配置的Spring AOP (2)Spring实现AOP方式之二:使用注解配置 Spring AOP (3)Spring AOP : AspectJ Pointcut 切点 (4)Spring AOP : Advice 声明 (通知注解)
Spring AOP(面向切面编程)是Java高级编程中的重要...Spring AOP的配置方式多样,包括基于接口的配置、schema-based配置和@AspectJ注解配置。通过这些配置方式,开发者可以灵活地实现AOP功能,满足不同场景下的需求。
6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点...
配置可以通过xml文件来进行,大概有四种方式: 1. 配置ProxyFactoryBean,显式地设置advisors, advice, target等(基于代理的AOP ) ...4. 通过<aop: aspectj-autoproxy>来配置,使用AspectJ的注解来标识通知及切入点
6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点...
6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个...
6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点...
第一课:面向抽象编程 4 第二课:Jdom的基本使用 4 第三课:模拟Spring功能 5 第四课:搭建sping的运行环境 8 一、 建立一个新的项目 8 二、 建立spring的配置文件 8 三、 引入spring的jar包 8 四、 测试代码: 8 五...
概念:面向切面编程,在不改变源码的情况下对方法进行增强,抽取横切关注点(日志处理,事务管理,安全检查,性能测试等等),使用AOP进行增强,使程序员只需要关注与业务逻辑编写. 专业术语 目标Target:需要增强的类 ...
第一课:面向抽象编程 4 第二课:Jdom的基本使用 4 第三课:模拟Spring功能 5 第四课:搭建sping的运行环境 8 一、 建立一个新的项目 8 二、 建立spring的配置文件 8 三、 引入spring的jar包 8 四、 测试代码: 8 五...
在Spring AOP中,切面通过常规类(基本模式方法)或者通过使用了注解@Aspect的常规类来实现。 连接点(Joint point):是指在程序执行期间的一个点,比如某个方法的执行或者是某个异常的处理。在Spring AOP中,一个...