背景:本人在项目开发过程中(注:项目用的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)中,通过Expression Language(EL,表达式语言)来访问被拦截方法的局部变量值。这通常涉及到Spring的代理机制、...
Spring AOP允许开发者定义切面,并在这些切面中指定拦截的方法。Spring AOP支持不同的代理策略,包括JDK动态代理和CGLIB代理。如果被代理的类没有实现接口,Spring AOP会采用CGLIB来生成代理对象。CGLIB(Code ...
`aop-jar`这个压缩包可能包含了Spring AOP的实现类、接口、以及其他相关的辅助类,例如动态代理类、切点匹配器等。在项目中,我们通常会将这个jar包引入到类路径下,以便使用Spring AOP的功能。 总的来说,Spring ...
Spring AOP会为每个目标对象创建一个子类,并覆盖其方法,添加AOP代理逻辑。 4. **代理模式的创建**:Spring AOP 使用`org.springframework.aop.framework.ProxyFactoryBean`或`@EnableAspectJAutoProxy`注解来配置...
在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...
在 Spring AOP 中,`org.springframework.aop.framework.JdkDynamicAopProxy` 类实现了 `InvocationHandler` 接口,当代理对象的方法被调用时,实际会执行 `JdkDynamicAopProxy.invoke()` 方法。这个方法会检查并...
Spring AOP代理是框架为实现切面功能创建的对象,它在运行时实现切面协议。Spring提供了两种代理方式:JDK动态代理和CGLIB代理。JDK代理适用于那些实现了接口的类,而CGLIB代理则适用于没有实现接口的类。 引介...
1. **代理**:Spring AOP支持两种类型的代理:JDK动态代理和CGLIB代理。JDK代理用于实现了接口的类,而CGLIB代理则用于没有接口或不希望使用接口的类。代理对象在调用目标方法时会执行切面逻辑。 2. **织入**:织入...
这篇博客文章“Spring Aop Advise方法(增强方法) 中获取目标方法的参数”可能详细解释了如何在Advise中获取被拦截方法的参数。为了深入理解这个主题,我们需要探讨以下几个关键知识点: 1. **AOP的基本概念**: - ...
在测试方法中,可以注入需要的bean,然后调用方法来触发AOP代理。这样,通知将在适当的时候被调用,我们可以验证其预期行为。 为了更深入地理解这些概念,你可以查看压缩包中的具体代码,例如,`ExampleAspect`类...
动态代理类会实现目标接口,并在调用接口方法时插入通知。因此,使用JDK动态代理的目标类必须实现至少一个接口。 2. **CGLIB动态代理**:如果目标类没有实现接口,Spring会使用CGLIB库创建一个目标类的子类,子类...
现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...
7. **AOP代理(AOP Proxy)**:由AOP框架创建的对象,用于包含通知逻辑。Spring提供了两种类型的代理:JDK动态代理和CGLIB代理。 8. **编织(Weaving)**:是指将通知插入到目标对象的过程。Spring AOP是在运行时...
总之,Spring AOP通过代理技术实现了面向切面编程,使得开发者能够更专注于业务逻辑,而将通用的横切关注点剥离出来,提高了代码的可读性和可维护性。通过深入理解Spring AOP的实现机制,我们可以更好地利用这一强大...
5. AOP代理的使用:当通过Spring的依赖注入(DI)获取到一个对象时,实际上得到的是一个代理对象。通过这个代理对象调用方法,Spring会自动插入预先定义好的通知逻辑。 总的来说,JDK动态代理是Spring AOP实现的...
Spring AOP代理详细介绍 前言: 一开始我对spring AOP还是属于一知半解的状态,这几天遇到一个问题,加上又查看了一些Spring相关知识,感觉对这个问题有了更深刻的认识。所以写下来分享一下。 我们知道,Spring支持...
在Spring AOP中,生成的代理类就是这样的一个代理对象,它在调用目标方法前后执行额外的操作。 在实际应用中,我们可以通过Spring的`@Aspect`注解和`@Component`注解将切面类注册到Spring容器中,这样Spring会自动...
在Spring框架中,AOP(面向切面编程)就是基于Java动态代理来完成的,用于实现横切关注点,如日志、事务管理等。这篇博客的文章链接虽然没有给出具体内容,但我们可以根据Java动态代理和Spring AOP的基本概念来深入...
在Spring AOP中,CGLIB用于为目标类创建代理对象。当无法使用Java动态代理(例如,目标类没有实现接口时)时,CGLIB就会派上用场。CGLIB-nodep版本去除了对其他库的依赖,便于独立使用。 4. **aopalliance-1.0.jar*...
5. **代理(Proxy)**:Spring AOP通过动态代理机制创建目标对象的代理,代理对象在调用目标方法时会自动插入切面逻辑。在Java项目中,Spring可以使用JDK动态代理或CGLIB动态代理来创建代理对象。 在实际应用中,...