`
jianglanlan
  • 浏览: 13244 次
  • 性别: Icon_minigender_1
  • 来自: 杭州市
社区版块
存档分类
最新评论

获取spring aop代理类指定方法

    博客分类:
  • java
阅读更多

        背景:本人在项目开发过程中(注:项目用的SpringMvc),有这么一种需求,系统所有的表格查询都有统一的查询接口,通过通用的Controller类组装查询条件以及调用查询接口返回查询数据。

        但是在实际开发中碰到了这么一个问题,由于项目中用到了springaop,所有的数据查询实现类都被包装成SpringAop代理类,遍历类的所有方法获取数据查询方法时,总是获取不到。代码如下图所示:

gridService = SpringContextHolder.getBean(service);//通过前端传入的对应业务实现类名获取对应查询类

Method[] methods = gridService.getClass().getMethods();//gridService为数据查询通用接口类

Object param = null;
			
for (Method method : methods) {
				
        Class<? extends Object>[] clazz = method.getParameterTypes();
				
	    if (method.getName().equals("queryItems") && clazz.length == 1) {
					
		if (clazz[0].getName().equals(Object.class.getName())) {
			continue;
		}
					
		param = org.springframework.beans.BeanUtils.instantiateClass(clazz[0]);
					
		break;
        }
}
List datas = gridService.queryItems(param);//datas为查询后的结果

           在实际测试过程中,param一直为空,也就是说找不到对应查询的方法。是怎么回事呢? 后来跟踪源代码查看,发现gridService为springaop包装的aop代理类(<aop:config>), 修改配置将<aop:config>修改成<aop:config proxy-target-class="true">,即使用cglib动态代理,情况依然。故分析,只能获取代理类的原始类,即如下代码所示:

   

       /**
	 * 获取 目标对象
	 * @param proxy 代理对象
	 */
	public static Object getTarget(Object proxy) throws Exception {

		if (!AopUtils.isAopProxy(proxy)) {
			return proxy;//不是代理对象
		}

		if (AopUtils.isJdkDynamicProxy(proxy)) {
			return getJdkDynamicProxyTargetObject(proxy);
		} else { //cglib
			return getCglibProxyTargetObject(proxy);
		}
	}

	private static Object getCglibProxyTargetObject(Object proxy) throws Exception {
		
		Object dynamicAdvisedInterceptor = ReflectionUtils.getFieldValue(proxy, "CGLIB$CALLBACK_0");

		Object target = ((AdvisedSupport) ReflectionUtils.getFieldValue(dynamicAdvisedInterceptor, "advised")).getTargetSource().getTarget();

		return target;
	}

	private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception {
		
		InvocationHandler invocationHandler = Proxy.getInvocationHandler(proxy);

		Object target = ((AdvisedSupport) ReflectionUtils.getFieldValue(invocationHandler, "advised")).getTargetSource().getTarget();

		return target;
	}

   Method[] methods = gridService.getClass().getMethods(); 改成

   getTarget(gridService).getClass().getMethods(),再行测试。此时,结果正常,将配置还原,结果正常。

分享到:
评论

相关推荐

    在自定义spring aop中使用el获取拦截方法的变量值。

    标题中的“在自定义Spring AOP中使用EL获取拦截方法的变量值”指的是在Spring的面向切面编程(AOP)中,通过Expression Language(EL,表达式语言)来访问被拦截方法的局部变量值。这通常涉及到Spring的代理机制、...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    Spring AOP允许开发者定义切面,并在这些切面中指定拦截的方法。Spring AOP支持不同的代理策略,包括JDK动态代理和CGLIB代理。如果被代理的类没有实现接口,Spring AOP会采用CGLIB来生成代理对象。CGLIB(Code ...

    spring aop jar 包

    `aop-jar`这个压缩包可能包含了Spring AOP的实现类、接口、以及其他相关的辅助类,例如动态代理类、切点匹配器等。在项目中,我们通常会将这个jar包引入到类路径下,以便使用Spring AOP的功能。 总的来说,Spring ...

    springAop默认代理方式.zip

    Spring AOP会为每个目标对象创建一个子类,并覆盖其方法,添加AOP代理逻辑。 4. **代理模式的创建**:Spring AOP 使用`org.springframework.aop.framework.ProxyFactoryBean`或`@EnableAspectJAutoProxy`注解来配置...

    spring之AOP(动态代理)

    在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    在 Spring AOP 中,`org.springframework.aop.framework.JdkDynamicAopProxy` 类实现了 `InvocationHandler` 接口,当代理对象的方法被调用时,实际会执行 `JdkDynamicAopProxy.invoke()` 方法。这个方法会检查并...

    Spring AOP 16道面试题及答案.docx

    Spring AOP代理是框架为实现切面功能创建的对象,它在运行时实现切面协议。Spring提供了两种代理方式:JDK动态代理和CGLIB代理。JDK代理适用于那些实现了接口的类,而CGLIB代理则适用于没有实现接口的类。 引介...

    简单spring aop 例子

    1. **代理**:Spring AOP支持两种类型的代理:JDK动态代理和CGLIB代理。JDK代理用于实现了接口的类,而CGLIB代理则用于没有接口或不希望使用接口的类。代理对象在调用目标方法时会执行切面逻辑。 2. **织入**:织入...

    Spring Aop Advise方法(增强方法) 中获取目标方法的参数

    这篇博客文章“Spring Aop Advise方法(增强方法) 中获取目标方法的参数”可能详细解释了如何在Advise中获取被拦截方法的参数。为了深入理解这个主题,我们需要探讨以下几个关键知识点: 1. **AOP的基本概念**: - ...

    Spring AOP完整例子

    在测试方法中,可以注入需要的bean,然后调用方法来触发AOP代理。这样,通知将在适当的时候被调用,我们可以验证其预期行为。 为了更深入地理解这些概念,你可以查看压缩包中的具体代码,例如,`ExampleAspect`类...

    springAOP配置动态代理实现

    动态代理类会实现目标接口,并在调用接口方法时插入通知。因此,使用JDK动态代理的目标类必须实现至少一个接口。 2. **CGLIB动态代理**:如果目标类没有实现接口,Spring会使用CGLIB库创建一个目标类的子类,子类...

    spring aop依赖jar包

    现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...

    Spring AOP面向方面编程原理:AOP概念

    7. **AOP代理(AOP Proxy)**:由AOP框架创建的对象,用于包含通知逻辑。Spring提供了两种类型的代理:JDK动态代理和CGLIB代理。 8. **编织(Weaving)**:是指将通知插入到目标对象的过程。Spring AOP是在运行时...

    Spring AOP实现机制

    总之,Spring AOP通过代理技术实现了面向切面编程,使得开发者能够更专注于业务逻辑,而将通用的横切关注点剥离出来,提高了代码的可读性和可维护性。通过深入理解Spring AOP的实现机制,我们可以更好地利用这一强大...

    JDK动态代理 spring aop 的原理

    5. AOP代理的使用:当通过Spring的依赖注入(DI)获取到一个对象时,实际上得到的是一个代理对象。通过这个代理对象调用方法,Spring会自动插入预先定义好的通知逻辑。 总的来说,JDK动态代理是Spring AOP实现的...

    Spring AOP代理详细介绍

    Spring AOP代理详细介绍 前言: 一开始我对spring AOP还是属于一知半解的状态,这几天遇到一个问题,加上又查看了一些Spring相关知识,感觉对这个问题有了更深刻的认识。所以写下来分享一下。 我们知道,Spring支持...

    spring-aop。以及把代理类 文件输出

    在Spring AOP中,生成的代理类就是这样的一个代理对象,它在调用目标方法前后执行额外的操作。 在实际应用中,我们可以通过Spring的`@Aspect`注解和`@Component`注解将切面类注册到Spring容器中,这样Spring会自动...

    Java动态代理(Spring Aop原理)

    在Spring框架中,AOP(面向切面编程)就是基于Java动态代理来完成的,用于实现横切关注点,如日志、事务管理等。这篇博客的文章链接虽然没有给出具体内容,但我们可以根据Java动态代理和Spring AOP的基本概念来深入...

    Spring Aop四个依赖的Jar包

    在Spring AOP中,CGLIB用于为目标类创建代理对象。当无法使用Java动态代理(例如,目标类没有实现接口时)时,CGLIB就会派上用场。CGLIB-nodep版本去除了对其他库的依赖,便于独立使用。 4. **aopalliance-1.0.jar*...

    spring aop spring aop

    5. **代理(Proxy)**:Spring AOP通过动态代理机制创建目标对象的代理,代理对象在调用目标方法时会自动插入切面逻辑。在Java项目中,Spring可以使用JDK动态代理或CGLIB动态代理来创建代理对象。 在实际应用中,...

Global site tag (gtag.js) - Google Analytics