Spring代理问题

AlenCheng 2017-04-27 04:53:25
一个很简单的springmvc工程。
从Bean工程中获取出来的bean,发现这个bean是cglib代理,但是居然不是springproxy,感觉很诡异。现在没有办法获取目标对象。希望各位大神能帮忙看看,到底是什么问题。

AopUtils.isCglibProxy(proxy) 为 false
AopUtils.isJdkDynamicProxy(proxy) 为false
AopUtils.isAopProxy(proxy) 为false

但是ClassUtils.isCglibProxy(proxy)却为true
...全文
381 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
AlenCheng 2017-04-27
  • 打赏
  • 举报
回复
引用 21 楼 pany1209 的回复:
[quote=引用 20 楼 AlenCheng的回复:][quote=引用 19 楼 pany1209 的回复:] [quote=引用 18 楼 AlenCheng的回复:][quote=引用 16 楼 pany1209 的回复:] [quote=引用 15 楼 ck199007081001 的回复:] [quote=引用 12 楼 pany1209 的回复:] [quote=引用 10 楼 ck199007081001 的回复:] [quote=引用 8 楼 pany1209 的回复:] [quote=引用 7 楼 ck199007081001 的回复:] [quote=引用 5 楼 pany1209 的回复:] 只要是用Aop的,如果没有接口正常应该是

AopUtils.isCglibProxy(proxy) 为 true
AopUtils.isJdkDynamicProxy(proxy) 为false
AopUtils.isAopProxy(proxy) 为true
但是ClassUtils.isCglibProxy(proxy)却为true说明满足这个条件。。。
你说的这种情况是正常情况,但是我现在这不是很正常....所以感觉很奇怪。 麻烦帮忙看看了。 我贴了图 。[/quote] 从Bean工程中获取出来的bean。。。。你的Bean有使用AOP吗???[/quote] 或者有办法获取这个bean的target么,然后获取target的属性.. [/quote] 上面这个接口的意思是由所有AOP代理实现的标记接口,用于检测对象是否是Spring生成的代理,这也就是你打印出false的原因[/quote] 在线等,麻烦帮忙看看了,这个问题真的蛮急的...多谢多谢!!!~[/quote] Object bean = beanFactory.getBean("helloController");强转为HelloController然后调用getClass看打印出什么???[/quote] 打印出来的是这个: class com.zhongan.mvc.demo.controller.HelloController$$EnhancerBySpringCGLIB$$32e1dc0e [/quote] 我艹。。。被cglib代理了,但是没有被AOP标记,我的controller用context扫描是不会被代理的,把这个代码随便建个类拿出来在main方法再试一下。。。有没有被代理[/quote] 擦....随便建一个service,没有被做任何代理...为什么就只有Controller被cglib代理了?难道跟mvc扫描有关系?我试试。。。 [/quote] 怀疑是你controller上面的那个注解的问题[/quote] 感谢~
AlenCheng 2017-04-27
  • 打赏
  • 举报
回复
引用 22 楼 ck199007081001 的回复:
[quote=引用 21 楼 pany1209 的回复:] [quote=引用 20 楼 AlenCheng的回复:][quote=引用 19 楼 pany1209 的回复:] [quote=引用 18 楼 AlenCheng的回复:][quote=引用 16 楼 pany1209 的回复:] [quote=引用 15 楼 ck199007081001 的回复:] [quote=引用 12 楼 pany1209 的回复:] [quote=引用 10 楼 ck199007081001 的回复:] [quote=引用 8 楼 pany1209 的回复:] [quote=引用 7 楼 ck199007081001 的回复:] [quote=引用 5 楼 pany1209 的回复:] 只要是用Aop的,如果没有接口正常应该是

AopUtils.isCglibProxy(proxy) 为 true
AopUtils.isJdkDynamicProxy(proxy) 为false
AopUtils.isAopProxy(proxy) 为true
但是ClassUtils.isCglibProxy(proxy)却为true说明满足这个条件。。。
你说的这种情况是正常情况,但是我现在这不是很正常....所以感觉很奇怪。 麻烦帮忙看看了。 我贴了图 。[/quote] 从Bean工程中获取出来的bean。。。。你的Bean有使用AOP吗???[/quote] 或者有办法获取这个bean的target么,然后获取target的属性.. [/quote] 上面这个接口的意思是由所有AOP代理实现的标记接口,用于检测对象是否是Spring生成的代理,这也就是你打印出false的原因[/quote] 在线等,麻烦帮忙看看了,这个问题真的蛮急的...多谢多谢!!!~[/quote] Object bean = beanFactory.getBean("helloController");强转为HelloController然后调用getClass看打印出什么???[/quote] 打印出来的是这个: class com.zhongan.mvc.demo.controller.HelloController$$EnhancerBySpringCGLIB$$32e1dc0e [/quote] 我艹。。。被cglib代理了,但是没有被AOP标记,我的controller用context扫描是不会被代理的,把这个代码随便建个类拿出来在main方法再试一下。。。有没有被代理[/quote] 擦....随便建一个service,没有被做任何代理...为什么就只有Controller被cglib代理了?难道跟mvc扫描有关系?我试试。。。 [/quote] 怀疑是你controller上面的那个注解的问题[/quote] 真的是跟@Configuration注解有关系...但是为啥?这个注解也没有打其他的注解呀... [/quote] 找到一篇文章,但是还是不清楚为什么@Configuration需要cglib http://www.java2novice.com/issues/cglib-is-required-to-process_configuration-classes/
AlenCheng 2017-04-27
  • 打赏
  • 举报
回复
引用 21 楼 pany1209 的回复:
[quote=引用 20 楼 AlenCheng的回复:][quote=引用 19 楼 pany1209 的回复:]
[quote=引用 18 楼 AlenCheng的回复:][quote=引用 16 楼 pany1209 的回复:]
[quote=引用 15 楼 ck199007081001 的回复:]
[quote=引用 12 楼 pany1209 的回复:]
[quote=引用 10 楼 ck199007081001 的回复:]
[quote=引用 8 楼 pany1209 的回复:]
[quote=引用 7 楼 ck199007081001 的回复:]
[quote=引用 5 楼 pany1209 的回复:]
只要是用Aop的,如果没有接口正常应该是

AopUtils.isCglibProxy(proxy) 为 true
AopUtils.isJdkDynamicProxy(proxy) 为false
AopUtils.isAopProxy(proxy) 为true

但是ClassUtils.isCglibProxy(proxy)却为true说明满足这个条件。。。


你说的这种情况是正常情况,但是我现在这不是很正常....所以感觉很奇怪。
麻烦帮忙看看了。
我贴了图 。[/quote]
从Bean工程中获取出来的bean。。。。你的Bean有使用AOP吗???[/quote]

或者有办法获取这个bean的target么,然后获取target的属性..

[/quote]

上面这个接口的意思是由所有AOP代理实现的标记接口,用于检测对象是否是Spring生成的代理,这也就是你打印出false的原因[/quote]

在线等,麻烦帮忙看看了,这个问题真的蛮急的...多谢多谢!!!~[/quote]
Object bean = beanFactory.getBean("helloController");强转为HelloController然后调用getClass看打印出什么???[/quote]
打印出来的是这个:
class com.zhongan.mvc.demo.controller.HelloController$$EnhancerBySpringCGLIB$$32e1dc0e
[/quote]
我艹。。。被cglib代理了,但是没有被AOP标记,我的controller用context扫描是不会被代理的,把这个代码随便建个类拿出来在main方法再试一下。。。有没有被代理[/quote]
擦....随便建一个service,没有被做任何代理...为什么就只有Controller被cglib代理了?难道跟mvc扫描有关系?我试试。。。
[/quote]
怀疑是你controller上面的那个注解的问题[/quote]
真的是跟@Configuration注解有关系...但是为啥?这个注解也没有打其他的注解呀...

李德胜1995 2017-04-27
  • 打赏
  • 举报
回复
引用 20 楼 AlenCheng的回复:
[quote=引用 19 楼 pany1209 的回复:]
[quote=引用 18 楼 AlenCheng的回复:][quote=引用 16 楼 pany1209 的回复:]
[quote=引用 15 楼 ck199007081001 的回复:]
[quote=引用 12 楼 pany1209 的回复:]
[quote=引用 10 楼 ck199007081001 的回复:]
[quote=引用 8 楼 pany1209 的回复:]
[quote=引用 7 楼 ck199007081001 的回复:]
[quote=引用 5 楼 pany1209 的回复:]
只要是用Aop的,如果没有接口正常应该是

AopUtils.isCglibProxy(proxy) 为 true
AopUtils.isJdkDynamicProxy(proxy) 为false
AopUtils.isAopProxy(proxy) 为true

但是ClassUtils.isCglibProxy(proxy)却为true说明满足这个条件。。。


你说的这种情况是正常情况,但是我现在这不是很正常....所以感觉很奇怪。
麻烦帮忙看看了。
我贴了图 。[/quote]
从Bean工程中获取出来的bean。。。。你的Bean有使用AOP吗???[/quote]

或者有办法获取这个bean的target么,然后获取target的属性..

[/quote]

上面这个接口的意思是由所有AOP代理实现的标记接口,用于检测对象是否是Spring生成的代理,这也就是你打印出false的原因[/quote]

在线等,麻烦帮忙看看了,这个问题真的蛮急的...多谢多谢!!!~[/quote]
Object bean = beanFactory.getBean("helloController");强转为HelloController然后调用getClass看打印出什么???[/quote]
打印出来的是这个:
class com.zhongan.mvc.demo.controller.HelloController$$EnhancerBySpringCGLIB$$32e1dc0e
[/quote]
我艹。。。被cglib代理了,但是没有被AOP标记,我的controller用context扫描是不会被代理的,把这个代码随便建个类拿出来在main方法再试一下。。。有没有被代理[/quote]
擦....随便建一个service,没有被做任何代理...为什么就只有Controller被cglib代理了?难道跟mvc扫描有关系?我试试。。。
[/quote] 怀疑是你controller上面的那个注解的问题
AlenCheng 2017-04-27
  • 打赏
  • 举报
回复
引用 19 楼 pany1209 的回复:
[quote=引用 18 楼 AlenCheng的回复:][quote=引用 16 楼 pany1209 的回复:]
[quote=引用 15 楼 ck199007081001 的回复:]
[quote=引用 12 楼 pany1209 的回复:]
[quote=引用 10 楼 ck199007081001 的回复:]
[quote=引用 8 楼 pany1209 的回复:]
[quote=引用 7 楼 ck199007081001 的回复:]
[quote=引用 5 楼 pany1209 的回复:]
只要是用Aop的,如果没有接口正常应该是

AopUtils.isCglibProxy(proxy) 为 true
AopUtils.isJdkDynamicProxy(proxy) 为false
AopUtils.isAopProxy(proxy) 为true

但是ClassUtils.isCglibProxy(proxy)却为true说明满足这个条件。。。


你说的这种情况是正常情况,但是我现在这不是很正常....所以感觉很奇怪。
麻烦帮忙看看了。
我贴了图 。[/quote]
从Bean工程中获取出来的bean。。。。你的Bean有使用AOP吗???[/quote]

或者有办法获取这个bean的target么,然后获取target的属性..

[/quote]

上面这个接口的意思是由所有AOP代理实现的标记接口,用于检测对象是否是Spring生成的代理,这也就是你打印出false的原因[/quote]

在线等,麻烦帮忙看看了,这个问题真的蛮急的...多谢多谢!!!~[/quote]
Object bean = beanFactory.getBean("helloController");强转为HelloController然后调用getClass看打印出什么???[/quote]
打印出来的是这个:
class com.zhongan.mvc.demo.controller.HelloController$$EnhancerBySpringCGLIB$$32e1dc0e
[/quote]
我艹。。。被cglib代理了,但是没有被AOP标记,我的controller用context扫描是不会被代理的,把这个代码随便建个类拿出来在main方法再试一下。。。有没有被代理[/quote]
擦....随便建一个service,没有被做任何代理...为什么就只有Controller被cglib代理了?难道跟mvc扫描有关系?我试试。。。
李德胜1995 2017-04-27
  • 打赏
  • 举报
回复
引用 18 楼 AlenCheng的回复:
[quote=引用 16 楼 pany1209 的回复:]
[quote=引用 15 楼 ck199007081001 的回复:]
[quote=引用 12 楼 pany1209 的回复:]
[quote=引用 10 楼 ck199007081001 的回复:]
[quote=引用 8 楼 pany1209 的回复:]
[quote=引用 7 楼 ck199007081001 的回复:]
[quote=引用 5 楼 pany1209 的回复:]
只要是用Aop的,如果没有接口正常应该是

AopUtils.isCglibProxy(proxy) 为 true
AopUtils.isJdkDynamicProxy(proxy) 为false
AopUtils.isAopProxy(proxy) 为true

但是ClassUtils.isCglibProxy(proxy)却为true说明满足这个条件。。。


你说的这种情况是正常情况,但是我现在这不是很正常....所以感觉很奇怪。
麻烦帮忙看看了。
我贴了图 。[/quote]
从Bean工程中获取出来的bean。。。。你的Bean有使用AOP吗???[/quote]

或者有办法获取这个bean的target么,然后获取target的属性..

[/quote]

上面这个接口的意思是由所有AOP代理实现的标记接口,用于检测对象是否是Spring生成的代理,这也就是你打印出false的原因[/quote]

在线等,麻烦帮忙看看了,这个问题真的蛮急的...多谢多谢!!!~[/quote]
Object bean = beanFactory.getBean("helloController");强转为HelloController然后调用getClass看打印出什么???[/quote]
打印出来的是这个:
class com.zhongan.mvc.demo.controller.HelloController$$EnhancerBySpringCGLIB$$32e1dc0e
[/quote] 我艹。。。被cglib代理了,但是没有被AOP标记,我的controller用context扫描是不会被代理的,把这个代码随便建个类拿出来在main方法再试一下。。。有没有被代理
AlenCheng 2017-04-27
  • 打赏
  • 举报
回复
引用 16 楼 pany1209 的回复:
[quote=引用 15 楼 ck199007081001 的回复:]
[quote=引用 12 楼 pany1209 的回复:]
[quote=引用 10 楼 ck199007081001 的回复:]
[quote=引用 8 楼 pany1209 的回复:]
[quote=引用 7 楼 ck199007081001 的回复:]
[quote=引用 5 楼 pany1209 的回复:]
只要是用Aop的,如果没有接口正常应该是

AopUtils.isCglibProxy(proxy) 为 true
AopUtils.isJdkDynamicProxy(proxy) 为false
AopUtils.isAopProxy(proxy) 为true

但是ClassUtils.isCglibProxy(proxy)却为true说明满足这个条件。。。


你说的这种情况是正常情况,但是我现在这不是很正常....所以感觉很奇怪。
麻烦帮忙看看了。
我贴了图 。[/quote]
从Bean工程中获取出来的bean。。。。你的Bean有使用AOP吗???[/quote]

或者有办法获取这个bean的target么,然后获取target的属性..

[/quote]

上面这个接口的意思是由所有AOP代理实现的标记接口,用于检测对象是否是Spring生成的代理,这也就是你打印出false的原因[/quote]

在线等,麻烦帮忙看看了,这个问题真的蛮急的...多谢多谢!!!~[/quote]
Object bean = beanFactory.getBean("helloController");强转为HelloController然后调用getClass看打印出什么???[/quote]
打印出来的是这个:
class com.zhongan.mvc.demo.controller.HelloController$$EnhancerBySpringCGLIB$$32e1dc0e
李德胜1995 2017-04-27
  • 打赏
  • 举报
回复
引用 15 楼 ck199007081001 的回复:
[quote=引用 12 楼 pany1209 的回复:] [quote=引用 10 楼 ck199007081001 的回复:] [quote=引用 8 楼 pany1209 的回复:] [quote=引用 7 楼 ck199007081001 的回复:] [quote=引用 5 楼 pany1209 的回复:] 只要是用Aop的,如果没有接口正常应该是

AopUtils.isCglibProxy(proxy) 为 true
AopUtils.isJdkDynamicProxy(proxy) 为false
AopUtils.isAopProxy(proxy) 为true
但是ClassUtils.isCglibProxy(proxy)却为true说明满足这个条件。。。
你说的这种情况是正常情况,但是我现在这不是很正常....所以感觉很奇怪。 麻烦帮忙看看了。 我贴了图 。[/quote] 从Bean工程中获取出来的bean。。。。你的Bean有使用AOP吗???[/quote] 或者有办法获取这个bean的target么,然后获取target的属性.. [/quote] 上面这个接口的意思是由所有AOP代理实现的标记接口,用于检测对象是否是Spring生成的代理,这也就是你打印出false的原因[/quote] 在线等,麻烦帮忙看看了,这个问题真的蛮急的...多谢多谢!!!~[/quote] Object bean = beanFactory.getBean("helloController");强转为HelloController然后调用getClass看打印出什么???
AlenCheng 2017-04-27
  • 打赏
  • 举报
回复
引用 12 楼 pany1209 的回复:
[quote=引用 10 楼 ck199007081001 的回复:] [quote=引用 8 楼 pany1209 的回复:] [quote=引用 7 楼 ck199007081001 的回复:] [quote=引用 5 楼 pany1209 的回复:] 只要是用Aop的,如果没有接口正常应该是

AopUtils.isCglibProxy(proxy) 为 true
AopUtils.isJdkDynamicProxy(proxy) 为false
AopUtils.isAopProxy(proxy) 为true
但是ClassUtils.isCglibProxy(proxy)却为true说明满足这个条件。。。
你说的这种情况是正常情况,但是我现在这不是很正常....所以感觉很奇怪。 麻烦帮忙看看了。 我贴了图 。[/quote] 从Bean工程中获取出来的bean。。。。你的Bean有使用AOP吗???[/quote] 或者有办法获取这个bean的target么,然后获取target的属性.. [/quote] 上面这个接口的意思是由所有AOP代理实现的标记接口,用于检测对象是否是Spring生成的代理,这也就是你打印出false的原因[/quote] 在线等,麻烦帮忙看看了,这个问题真的蛮急的...多谢多谢!!!~
AlenCheng 2017-04-27
  • 打赏
  • 举报
回复
引用 12 楼 pany1209 的回复:
[quote=引用 10 楼 ck199007081001 的回复:] [quote=引用 8 楼 pany1209 的回复:] [quote=引用 7 楼 ck199007081001 的回复:] [quote=引用 5 楼 pany1209 的回复:] 只要是用Aop的,如果没有接口正常应该是

AopUtils.isCglibProxy(proxy) 为 true
AopUtils.isJdkDynamicProxy(proxy) 为false
AopUtils.isAopProxy(proxy) 为true
但是ClassUtils.isCglibProxy(proxy)却为true说明满足这个条件。。。
你说的这种情况是正常情况,但是我现在这不是很正常....所以感觉很奇怪。 麻烦帮忙看看了。 我贴了图 。[/quote] 从Bean工程中获取出来的bean。。。。你的Bean有使用AOP吗???[/quote] 或者有办法获取这个bean的target么,然后获取target的属性.. [/quote] 上面这个接口的意思是由所有AOP代理实现的标记接口,用于检测对象是否是Spring生成的代理,这也就是你打印出false的原因[/quote] 嗯,问题原因我现在清楚,但是不知道怎么解了...我就不明白为什么我这个controller不是spring的代理。
AlenCheng 2017-04-27
  • 打赏
  • 举报
回复
引用 11 楼 pany1209 的回复:
[quote=引用 9 楼 ck199007081001 的回复:]
[quote=引用 8 楼 pany1209 的回复:]
[quote=引用 7 楼 ck199007081001 的回复:]
[quote=引用 5 楼 pany1209 的回复:]
只要是用Aop的,如果没有接口正常应该是

AopUtils.isCglibProxy(proxy) 为 true
AopUtils.isJdkDynamicProxy(proxy) 为false
AopUtils.isAopProxy(proxy) 为true

但是ClassUtils.isCglibProxy(proxy)却为true说明满足这个条件。。。


你说的这种情况是正常情况,但是我现在这不是很正常....所以感觉很奇怪。
麻烦帮忙看看了。
我贴了图 。[/quote]
从Bean工程中获取出来的bean。。。。你的Bean有使用AOP吗???[/quote]
我没有手动去做aop,但是为什么我从bean工厂取出来的bean被加上了cglib代理呢?[/quote]
我用AOP给service层做事务,没有使用接口就是CGLIB动态代理,使用接口就是JDK动态代理。。。。
上面四个方法打印正常。。。[/quote]

我贴一个demo。
pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zhongan.mvc.demo</groupId>
<artifactId>SpringMVCDemo</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>SpringMVCDemo Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.0.RELEASE</version>
</dependency>
</dependencies>
<build>
<finalName>SpringMVCDemo</finalName>
</build>
</project>


web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>Archetype Created Web Application</display-name>

<servlet>
<servlet-name>Dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

</web-app>


spring-servlet.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:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

<!-- scan the package and the sub package -->
<context:component-scan base-package="com.zhongan.mvc.demo" />

<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:config.properties</value>
<value>classpath:config2.properties</value>
</list>
</property>
</bean>

<!-- if you use annotation you must configure following setting -->
<mvc:annotation-driven />

</beans>


HelloController.java

package com.zhongan.mvc.demo.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Configuration
@Controller
public class HelloController {

@Value("${config.name}")
private String name;

// @Value("${gateway-dispather.limit.limit01}")
private String limit;

@RequestMapping(value = "/mvc/hello")
@ResponseBody
public String hello() {
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) ApplicationContextUtils.getApplicationContext().getAutowireCapableBeanFactory();
Object bean = beanFactory.getBean("helloController");
bean = ProxyTargetUtils.getTarget(bean);
return "hello";
}

}



ProxyTargetUtils.java

package com.zhongan.mvc.demo.controller;

import java.lang.reflect.Field;

import org.springframework.aop.framework.AdvisedSupport;
import org.springframework.aop.framework.AopProxy;
import org.springframework.aop.support.AopUtils;

/**
* 代理目标对象工具类
* @author chengkai
*
*/
public class ProxyTargetUtils {

public static boolean isCglibProxy(Object proxy) {
return AopUtils.isCglibProxy(proxy);
}

public static boolean isJdkDynamicProxy(Object proxy) {
return AopUtils.isJdkDynamicProxy(proxy);
}

public static Object getTarget(Object proxy) {
if (AopUtils.isCglibProxy(proxy)) {
return getCglibProxyTargetObject(proxy);
} else if (AopUtils.isJdkDynamicProxy(proxy)) {
return getJdkDynamicProxyTargetObject(proxy);
} else {
return proxy;
}
}

private static Object getCglibProxyTargetObject(Object proxy) {
Object target = null;
try {
Field field = proxy.getClass().getDeclaredField("CGLIB$CALLBACK_0");
field.setAccessible(true);
Object dynamicAdvisedInterceptor = field.get(proxy);

Field advised = dynamicAdvisedInterceptor.getClass().getDeclaredField("advised");
advised.setAccessible(true);

target = ((AdvisedSupport) advised.get(dynamicAdvisedInterceptor)).getTargetSource().getTarget();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return target;
}

private static Object getJdkDynamicProxyTargetObject(Object proxy) {
Object target = null;
try {
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);

target = ((AdvisedSupport) advised.get(aopProxy)).getTargetSource().getTarget();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return target;
}

}



ApplicationContextUtils.java

package com.zhongan.mvc.demo.controller;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class ApplicationContextUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;

public void setApplicationContext(ApplicationContext arg0) throws BeansException {
if (ApplicationContextUtils.applicationContext == null) {
ApplicationContextUtils.applicationContext = arg0;
}
}

// 获取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
}

// 通过name获取 Bean.
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}

// 通过class获取Bean.
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}

// 通过name,以及Clazz返回指定的Bean
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}

}


config.properties

config.name=kaicheng


李德胜1995 2017-04-27
  • 打赏
  • 举报
回复
引用 10 楼 ck199007081001 的回复:
[quote=引用 8 楼 pany1209 的回复:]
[quote=引用 7 楼 ck199007081001 的回复:]
[quote=引用 5 楼 pany1209 的回复:]
只要是用Aop的,如果没有接口正常应该是

AopUtils.isCglibProxy(proxy) 为 true
AopUtils.isJdkDynamicProxy(proxy) 为false
AopUtils.isAopProxy(proxy) 为true

但是ClassUtils.isCglibProxy(proxy)却为true说明满足这个条件。。。


你说的这种情况是正常情况,但是我现在这不是很正常....所以感觉很奇怪。
麻烦帮忙看看了。
我贴了图 。[/quote]
从Bean工程中获取出来的bean。。。。你的Bean有使用AOP吗???[/quote]

或者有办法获取这个bean的target么,然后获取target的属性..

[/quote]

上面这个接口的意思是由所有AOP代理实现的标记接口,用于检测对象是否是Spring生成的代理,这也就是你打印出false的原因
李德胜1995 2017-04-27
  • 打赏
  • 举报
回复
引用 9 楼 ck199007081001 的回复:
[quote=引用 8 楼 pany1209 的回复:] [quote=引用 7 楼 ck199007081001 的回复:] [quote=引用 5 楼 pany1209 的回复:] 只要是用Aop的,如果没有接口正常应该是

AopUtils.isCglibProxy(proxy) 为 true
AopUtils.isJdkDynamicProxy(proxy) 为false
AopUtils.isAopProxy(proxy) 为true
但是ClassUtils.isCglibProxy(proxy)却为true说明满足这个条件。。。
你说的这种情况是正常情况,但是我现在这不是很正常....所以感觉很奇怪。 麻烦帮忙看看了。 我贴了图 。[/quote] 从Bean工程中获取出来的bean。。。。你的Bean有使用AOP吗???[/quote] 我没有手动去做aop,但是为什么我从bean工厂取出来的bean被加上了cglib代理呢?[/quote] 我用AOP给service层做事务,没有使用接口就是CGLIB动态代理,使用接口就是JDK动态代理。。。。 上面四个方法打印正常。。。
AlenCheng 2017-04-27
  • 打赏
  • 举报
回复
引用 8 楼 pany1209 的回复:
[quote=引用 7 楼 ck199007081001 的回复:] [quote=引用 5 楼 pany1209 的回复:] 只要是用Aop的,如果没有接口正常应该是

AopUtils.isCglibProxy(proxy) 为 true
AopUtils.isJdkDynamicProxy(proxy) 为false
AopUtils.isAopProxy(proxy) 为true
但是ClassUtils.isCglibProxy(proxy)却为true说明满足这个条件。。。
你说的这种情况是正常情况,但是我现在这不是很正常....所以感觉很奇怪。 麻烦帮忙看看了。 我贴了图 。[/quote] 从Bean工程中获取出来的bean。。。。你的Bean有使用AOP吗???[/quote] 或者有办法获取这个bean的target么,然后获取target的属性..
AlenCheng 2017-04-27
  • 打赏
  • 举报
回复
引用 8 楼 pany1209 的回复:
[quote=引用 7 楼 ck199007081001 的回复:] [quote=引用 5 楼 pany1209 的回复:] 只要是用Aop的,如果没有接口正常应该是

AopUtils.isCglibProxy(proxy) 为 true
AopUtils.isJdkDynamicProxy(proxy) 为false
AopUtils.isAopProxy(proxy) 为true
但是ClassUtils.isCglibProxy(proxy)却为true说明满足这个条件。。。
你说的这种情况是正常情况,但是我现在这不是很正常....所以感觉很奇怪。 麻烦帮忙看看了。 我贴了图 。[/quote] 从Bean工程中获取出来的bean。。。。你的Bean有使用AOP吗???[/quote] 我没有手动去做aop,但是为什么我从bean工厂取出来的bean被加上了cglib代理呢?
李德胜1995 2017-04-27
  • 打赏
  • 举报
回复
引用 7 楼 ck199007081001 的回复:
[quote=引用 5 楼 pany1209 的回复:] 只要是用Aop的,如果没有接口正常应该是

AopUtils.isCglibProxy(proxy) 为 true
AopUtils.isJdkDynamicProxy(proxy) 为false
AopUtils.isAopProxy(proxy) 为true
但是ClassUtils.isCglibProxy(proxy)却为true说明满足这个条件。。。
你说的这种情况是正常情况,但是我现在这不是很正常....所以感觉很奇怪。 麻烦帮忙看看了。 我贴了图 。[/quote] 从Bean工程中获取出来的bean。。。。你的Bean有使用AOP吗???
AlenCheng 2017-04-27
  • 打赏
  • 举报
回复
引用 5 楼 pany1209 的回复:
只要是用Aop的,如果没有接口正常应该是

AopUtils.isCglibProxy(proxy) 为 true
AopUtils.isJdkDynamicProxy(proxy) 为false
AopUtils.isAopProxy(proxy) 为true
但是ClassUtils.isCglibProxy(proxy)却为true说明满足这个条件。。。
你说的这种情况是正常情况,但是我现在这不是很正常....所以感觉很奇怪。 麻烦帮忙看看了。 我贴了图 。
AlenCheng 2017-04-27
  • 打赏
  • 举报
回复
引用 4 楼 yql1986 的回复:
http://www.cnblogs.com/jgig11/p/5764352.html

我目前就是用这种方式做的,但是没用。




我dbug看了下,具体是因为这个对象不是springproxy。
但是不知道为什么,我debug的这个bean只是一个controller。
麻烦再帮忙看看了。谢谢~
李德胜1995 2017-04-27
  • 打赏
  • 举报
回复
只要是用Aop的,如果没有接口正常应该是

AopUtils.isCglibProxy(proxy) 为 true
AopUtils.isJdkDynamicProxy(proxy) 为false
AopUtils.isAopProxy(proxy) 为true

但是ClassUtils.isCglibProxy(proxy)却为true说明满足这个条件。。。
yql1986 2017-04-27
  • 打赏
  • 举报
回复
http://www.cnblogs.com/jgig11/p/5764352.html
加载更多回复(3)

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧