`
binker
  • 浏览: 17309 次
  • 性别: Icon_minigender_1
  • 来自: jiangsu
社区版块
存档分类
最新评论

请教:使用spring2.0 @AspectJ注解风格进行AOP编程时遇到问题:传递参数到Advice失败。

阅读更多
请教:使用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);
	}
}



请大家帮助,谢谢。

分享到:
评论
3 楼 will.jiang 2007-08-29  
解决了,使用args就能够成功传递参数到advice中去。

需要加入asm的几个包:asm-2.2.3.jar,asm-commons-2.2.3.jar,asm-util.2.2.3.jar

done!

2 楼 will.jiang 2007-08-29  
我也碰到了同样的问题,照文档上说,只要使用args就行
@Before("execution(* somepackage.SomeClass.someMethod(..)) && args(someParam)")
public void before(SomeType someParam){
  //do something with 'someParam'
}

但实际运行中总是报错:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'someService' defined in class path resource [somepackage/applicationContext.xml]: Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor

Caused by: java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor

郁闷~~
1 楼 ucgygah 2006-12-14  
Object[]obj= joinpoint.getArgs();
System.out.println(obj[0]);
你想要的参数就是根据参数列表的索引得到的.

相关推荐

    @AspectJ配置Spring AOP,demo

    在Spring AOP中,@AspectJ注解是实现切面编程的关键。@AspectJ是一种类型级别的元数据,它允许我们定义切面类,其中包含了切点(Pointcut)、通知(Advice)和组装(Join Point)等概念。 **一、@AspectJ注解** @...

    Spring AOP @AspectJ 入门实例

    在IT行业中,Spring框架是Java企业级应用开发的首选,而Spring AOP(面向切面编程)则是其核心特性之一,用于实现横切关注点的模块化,如日志、事务管理等。本实例将带你深入理解并实践Spring AOP与@AspectJ的结合...

    Spring AOP 概念理解及@AspectJ支持

    **Spring AOP 概念理解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它允许我们通过...理解和熟练运用Spring AOP及其@AspectJ注解是每个Spring开发者必备的技能之一。

    Spring的AOP实例(XML+@AspectJ双版本解析+源码+类库)

    在Java世界中,Spring框架以其强大的功能和灵活性深受开发者喜爱,尤其在面向切面编程(AOP)方面,Spring提供了两种主要的实现方式:XML配置和@AspectJ注解。本篇文章将深入探讨这两个版本的AOP实现,并结合源码...

    Spring @AspectJ 实现AOP 入门例子

    本文将深入探讨如何使用Spring的@AspectJ注解来实现AOP,这是一个入门级别的教程,旨在帮助开发者理解并掌握这一重要概念。 **什么是AOP?** 面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式...

    Spring 使用AspectJ 实现 AOP

    在Spring中,我们可以使用AspectJ来实现AOP,AspectJ是一个强大的AOP框架,它可以与Spring无缝集成,提供更细粒度的控制。 首先,让我们了解一下AOP中的通知类型: 1. **前置通知**(Before Advice):在目标方法...

    Spring 使用AspectJ 实现 AOP(基于xml文件、基于注解)

    4. **启用注解驱动的AOP**: 在Spring配置中,使用`@EnableAspectJAutoProxy`注解开启对AspectJ注解的支持。 例如: ```java @Aspect @Component public class MyAspect { @Before("execution(* ...

    spring对AOP的支持(使用AspectJ进行AOP演示)

    Spring 框架是 Java 开发中的重要组件,它提供了丰富的功能,其中之一就是对面向切面编程(AOP)的支持。面向切面编程是一种编程范式,旨在将关注点分离,使得业务逻辑与横切关注点(如日志、事务管理、安全检查等)...

    Spring AOP之基于AspectJ注解总结与案例

    本篇内容将对Spring AOP中基于AspectJ注解的使用进行总结,并通过实际案例进行解析。 首先,让我们理解AspectJ注解在Spring AOP中的核心概念: 1. **@Aspect**: 这个注解用于定义一个类为切面,这个类将包含切点和...

    aspectj的jar spring使用aop需要的jar

    在Spring框架中,面向切面编程(AOP)是一种强大的设计模式,它允许开发者定义“横切关注点”,如日志、事务管理、安全性等,这些关注点可以被解耦并独立于业务逻辑进行处理。AspectJ是Java平台上的一个开源AOP框架...

    spring 2.0使用AOP实例(基于Annotation的配置方式)

    Spring 2.0引入了基于注解的AOP配置,极大地简化了AOP的使用。这篇博客文章将探讨如何在Spring 2.0中使用AOP实例,特别是通过注解来实现。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了...

    AspectJ in Action: Enterprise AOP with Spring Applications

    ### AspectJ in Action: Enterprise AOP with Spring Applications #### 关键知识点概述 1. **Spring-AspectJ集成:**本书重点介绍了Spring框架与AspectJ相结合的技术优势及其在企业级应用中的强大功能。 2. **...

    Spring 使用AspectJ 实现 AOP之前置通知小例子

    标题提到的"Spring 使用AspectJ 实现 AOP之前置通知小例子",指的是利用AspectJ在Spring中实现AOP的一种特定类型的通知——前置通知(Before advice)。前置通知在目标方法执行之前运行,但不会阻止方法的执行。这种...

    spring aop注解版

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理等。在本主题中,我们将深入探讨Spring AOP的注解版,它是基于Java注解的...

    【Spring AOP】@Aspect结合案例详解(二): @Pointcut使用@within和within

    在微服务流行的当下,在使用Spring Cloud / Spring Boot框架开发中,AOP使用的非常广泛,尤其是@Aspect注解方式当属最流行的,不止功能强大,性能也很优秀,还很舒心!所以本系列就结合案例详细介绍@Aspect方式的切...

    Spring的AOP依赖包-AspectJ

    当启用AspectJ注解驱动的AOP(`@EnableAspectJAutoProxy`),Spring会自动创建代理对象来处理通知。此外,还可以通过`@AspectJSupport`和`&lt;aop:aspectj-autoproxy&gt;`元素来启用XML配置方式。 在实际应用中,AspectJ...

    Spring2.5使用AOP需要的aspectJ

    本篇文章将详细探讨在Spring 2.5中使用AspectJ进行AOP开发所需的知识点。 首先,我们需要理解AOP的核心概念: 1. **切面(Aspect)**:切面是关注点的模块化,它封装了多个相关方法,这些方法在程序的不同点执行,...

    详解在Spring中如何使用AspectJ来实现AOP

    2. Spring中使用AspectJ:在Spring框架中,可以使用AspectJ来实现AOP,通过引入AspectJ相关类库,使用AspectJ注解来描述切点和增强,并使用Spring的AOP支持来织入增强。 3. 编程方式:使用AspectJ来实现AOP,需要...

Global site tag (gtag.js) - Google Analytics