- 浏览: 624652 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (819)
- java开发 (110)
- 数据库 (56)
- javascript (30)
- 生活、哲理 (17)
- jquery (36)
- 杂谈 (15)
- linux (62)
- spring (52)
- kafka (11)
- http协议 (22)
- 架构 (18)
- ZooKeeper (18)
- eclipse (13)
- ngork (2)
- dubbo框架 (6)
- Mybatis (9)
- 缓存 (28)
- maven (20)
- MongoDB (3)
- 设计模式 (3)
- shiro (10)
- taokeeper (1)
- 锁和多线程 (3)
- Tomcat7集群 (12)
- Nginx (34)
- nodejs (1)
- MDC (1)
- Netty (7)
- solr (15)
- JSON (8)
- rabbitmq (32)
- disconf (7)
- PowerDesigne (0)
- Spring Boot (31)
- 日志系统 (6)
- erlang (2)
- Swagger (3)
- 测试工具 (3)
- docker (17)
- ELK (2)
- TCC分布式事务 (2)
- marathon (12)
- phpMyAdmin (12)
- git (3)
- Atomix (1)
- Calico (1)
- Lua (7)
- 泛解析 (2)
- OpenResty (2)
- spring mvc (19)
- 前端 (3)
- spring cloud (15)
- Netflix (1)
- zipkin (3)
- JVM 内存模型 (5)
- websocket (1)
- Eureka (4)
- apollo (2)
- idea (2)
- go (1)
- 业务 (0)
- idea开发工具 (1)
最新评论
-
sichunli_030:
对于频繁调用的话,建议采用连接池机制
配置TOMCAT及httpClient的keepalive以高效利用长连接 -
11想念99不见:
你好,我看不太懂。假如我的项目中会频繁调用rest接口,是要用 ...
配置TOMCAT及httpClient的keepalive以高效利用长连接
昨天晚上一哥们需要获取代理对象的目标对象,查找了文档发现没有相应的工具类,因此自己写了一个分享给大家。能获取JDK动态代理/CGLIB代理对象代理的目标对象。
问题描述::
我现在遇到个棘手的问题,要通过spring托管的service类保存对象,这个类是通过反射拿到的,经过实验发现这个类只能反射取得sservice实现了接口的方法,而extends类的方法一律不出现,debug后发现这个servie实例被spring替换成jdkdynmicproxy类,而不是原始对象了,,它里面只有service继承的接口方法,而没有extends 过的super class方法,怎么调用原生对象的方法!!!!!
用托管的spring service类调用getClass().getName()方法,发现输出都是$proxy43这类东西!!
通过此种方式获取目标对象是不可靠的,或者说任何获取目标对象的方式都是不可靠的,因为TargetSource,TargetSource中存放了目标对象,但TargetSource有很多种实现,默认我们使用的是SingletonTargetSource ,但还有其他的比如ThreadLocalTargetSource、CommonsPoolTargetSource 等等。
这也是为什么spring没有提供获取目标对象的API
Spring的aop代理对象都实现了Advised这个接口,可以直接将代理对象转成Advised类型后通过该接口提供的方法获取目标对象,我的项目使用这个方式来获取目标对象,貌似没什么问题
参考:http://jinnianshilongnian.iteye.com/blog/1613222
问题描述::
我现在遇到个棘手的问题,要通过spring托管的service类保存对象,这个类是通过反射拿到的,经过实验发现这个类只能反射取得sservice实现了接口的方法,而extends类的方法一律不出现,debug后发现这个servie实例被spring替换成jdkdynmicproxy类,而不是原始对象了,,它里面只有service继承的接口方法,而没有extends 过的super class方法,怎么调用原生对象的方法!!!!!
用托管的spring service类调用getClass().getName()方法,发现输出都是$proxy43这类东西!!
通过此种方式获取目标对象是不可靠的,或者说任何获取目标对象的方式都是不可靠的,因为TargetSource,TargetSource中存放了目标对象,但TargetSource有很多种实现,默认我们使用的是SingletonTargetSource ,但还有其他的比如ThreadLocalTargetSource、CommonsPoolTargetSource 等等。
这也是为什么spring没有提供获取目标对象的API
import java.lang.reflect.Field; import org.springframework.aop.framework.AdvisedSupport; import org.springframework.aop.framework.AopProxy; import org.springframework.aop.support.AopUtils; public class AopTargetUtils { /** * 获取 目标对象 * @param proxy 代理对象 * @return * @throws Exception */ 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 { Field h = proxy.getClass().getDeclaredField("CGLIB$CALLBACK_0"); h.setAccessible(true); Object dynamicAdvisedInterceptor = h.get(proxy); Field advised = dynamicAdvisedInterceptor.getClass().getDeclaredField("advised"); advised.setAccessible(true); Object target = ((AdvisedSupport)advised.get(dynamicAdvisedInterceptor)).getTargetSource().getTarget(); return target; } private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception { Field h = proxy.getClass().getSuperclass().getDeclaredField("h"); h.setAccessible(true); AopProxy aopProxy = (AopProxy) h.get(proxy); Field advised = aopProxy.getClass().getDeclaredField("advised"); advised.setAccessible(true); Object target = ((AdvisedSupport)advised.get(aopProxy)).getTargetSource().getTarget(); return target; } }
Spring的aop代理对象都实现了Advised这个接口,可以直接将代理对象转成Advised类型后通过该接口提供的方法获取目标对象,我的项目使用这个方式来获取目标对象,貌似没什么问题
参考:http://jinnianshilongnian.iteye.com/blog/1613222
发表评论
-
TransactionalEventListener注解
2021-07-04 12:14 1118TransactionalEventListener注解 记 ... -
Spring核心之bean
2021-06-16 13:49 207Spring Aop介绍 AOP,确实难,会让很多人懵逼 ... -
不使用@EnableTransactionManagement注解就能使用事务
2021-06-13 11:03 463https://blog.csdn.net/weixin_38 ... -
spring4.1.8扩展实战之三
2019-01-03 23:35 410spring4.1.8扩展实战之三:广播与监听 https:/ ... -
Spring装配Bean的过程
2018-03-22 20:40 346(spring-第1回【IoC基础篇】)Spring容器中Be ... -
第三章 DispatcherServlet详解 ——跟开涛学SpringMVC
2018-03-20 19:54 480http://jinnianshilongnian.iteye ... -
Spring事件机制
2017-10-26 22:56 343Spring事件机制的简单例子 http://blog.cs ... -
Spring3.1新属性管理API:PropertySource、Environment、Profile
2017-09-06 20:17 428http://jinnianshilongnian.iteye ... -
FactoryBean的实现原理与作用
2017-09-05 20:50 0FactoryBean的实现原理与作用 http://blog ... -
@Inject和@Autowired以及@Resource区别
2017-08-21 15:52 726@value 注解配置默认值 但是,如果配置文件中没有设置 n ... -
通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
2017-08-02 09:51 540关于在spring 容器初始化 bean 和销毁前所做的操作 ... -
Spring HttpInvoker远程调用的例子
2017-07-20 19:42 401http://blog.csdn.net/liuhui_306 ... -
spring 获取bean的几种方式
2017-07-20 17:36 398http://www.cnblogs.com/luoluosh ... -
一句话概括下spring框架及spring cloud框架主要组件
2017-07-19 16:56 44作为java的屌丝,基本上 ... -
AOP日志,记录调用类、方法、方法参数名称、方法参数值(包括对象和基本类型)
2017-07-15 19:15 2238http://blog.csdn.net/paincupid/ ... -
spring mvc Controller中使用@Value无法获取属性值
2017-06-28 17:14 961http://www.cnblogs.com/xianan87 ... -
4种方法让SpringMVC接收多个对象
2017-06-06 11:23 525http://blog.csdn.net/lutinghuan ... -
springmvc在普通类中获取HttpServletRequest对象
2017-05-25 17:18 727https://stackoverflow.com/quest ... -
spring的配置文件中mvc:view-controller path使用方法
2017-05-14 13:11 872[list] 1、重定向 <mvc:view-contr ... -
warning no match for this type name: com.cloud.access.web [Xlint:invalidA
2017-02-27 08:47 1520warning no match for this type ...
相关推荐
本文将深入探讨如何在Spring中通过自定义工具类获取代理对象所代理的目标对象。 ### 核心概念:AOP与Spring Proxy 在理解如何获取目标对象之前,我们需要先了解Spring AOP的实现机制。Spring AOP主要通过动态代理...
Spring AOP通过代理模式为我们提供了在运行时向目标对象添加拦截器或切面的能力,这在进行日志记录、性能监控、事务管理等场景下非常实用。 首先,让我们了解代理模式的基本概念。代理模式是一种设计模式,它为一个...
在Java开发中,动态代理是一种强大...4. 实现BeanPostProcessor并覆盖postProcessBeforeInitialization方法,在Spring初始化过程中注册代理对象。 5. 其他组件通过@Autowired注解注入代理对象,实现对代理接口的调用。
5. **代理的使用**:在应用中,我们通常不直接引用目标对象,而是通过ApplicationContext获取Bean,此时Spring会自动创建并返回相应的代理对象。这样,当我们调用代理对象的方法时,就会触发AOP代理逻辑。 6. **切...
描述中提到的“在获取目标类的时间我们将增强的代理类给返回”,实际上是指在Spring容器通过`FactoryBean`创建bean时,我们可以返回一个被代理的目标对象。通常,这个代理对象可能是通过AOP(面向切面编程)创建的,...
在Java开发中,代理模式是一种常见的设计...`AopTargetUtils`类则是Spring AOP中一个重要的辅助工具,帮助我们在处理AOP代理时更好地操作目标对象。理解这些概念和工具对于深入掌握Spring框架和Java代理技术至关重要。
Spring 动态代理是 Spring 框架中的一个重要特性,它允许我们在运行时自动生成代理对象,以便在方法调用前后执行额外的操作,比如事务管理、AOP(面向切面编程)等。动态代理主要涉及两个核心接口:`java.lang....
标题中的“在自定义Spring AOP中使用EL获取拦截方法的变量值”指的是在Spring的面向切面编程(AOP)中,通过Expression Language(EL,表达式语言)来访问被拦截方法的局部变量值。这通常涉及到Spring的代理机制、...
5. AOP代理的使用:当通过Spring的依赖注入(DI)获取到一个对象时,实际上得到的是一个代理对象。通过这个代理对象调用方法,Spring会自动插入预先定义好的通知逻辑。 总的来说,JDK动态代理是Spring AOP实现的...
本文将深入解析Spring AOP如何获取代理对象,即Proxy。 首先,我们需要理解AOP的核心概念: 1. **Advice**:通知,是切面实际执行的操作。在Spring中,Advice可以是Before、AfterReturning、AfterThrowing以及...
- 代理(Proxy):Spring创建的对象,用于在实际调用目标方法之前和之后执行通知。 3. **获取目标方法参数**: - 在Spring AOP的通知中,我们可以使用`MethodInterceptor`接口的`invoke`方法或者自定义的`Advisor...
2. **创建代理对象(Proxy Object)**:代理对象是围绕目标对象创建的,它在调用目标对象的方法之前和之后执行额外的逻辑。在JDK动态代理中,我们通过实现`java.lang.reflect.InvocationHandler`接口并实现其`invoke...
在需要调用目标方法的地方,使用Spring注入的bean,实际上就是在操作代理对象。 综上所述,通过理解Spring AOP的配置和动态代理机制,我们可以灵活地在项目中添加横切关注点,提升代码的模块化和可维护性。在实际...
3. 在应用启动时,使用Spring.NET容器加载配置,并从容器中获取代理对象。 4. 通过代理对象调用目标方法,观察AOP行为。 通过这个例子,你可以学习到如何在Spring.NET环境中实现AOP,理解动态代理的工作原理,并...
7. 在需要使用`Printer`的地方,通过Spring的依赖注入获取到的是Spring创建的代理对象,而非原始的`ConcretePrinter`实例。 这个示例可以帮助开发者理解如何在实际项目中利用Spring AOP和代理来增强或修饰对象的...
5. **生成并获取代理对象**:调用`create`方法,生成代理对象。 在附件的"demo"中,可能包含了这两个代理方式的示例代码,包括如何创建和使用代理对象,以及如何在`InvocationHandler`或`MethodInterceptor`中添加...
- 调用Spring容器获取代理对象,执行业务方法时,相应的通知方法会被自动插入。 通过Java动态代理和Spring AOP,开发者能够轻松地实现代码的解耦,提高可维护性和复用性。在实际开发中,理解这些原理并合理运用,...
`Proxy.newProxyInstance()`方法接受一个类加载器、接口数组和一个`InvocationHandler`,在调用代理对象的方法时,实际调用的是`InvocationHandler.invoke()`。 5. **元数据解析**:Spring使用`...
- 最后,通过Proxy.newProxyInstance()方法,传入目标接口、InvocationHandler实例以及加载器,生成代理对象。 2. **实现切面逻辑:** - 在InvocationHandler的invoke()方法中,我们可以获取到被调用的方法名、...