`
jinnianshilongnian
  • 浏览: 21431710 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2404524
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2997232
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5631111
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257451
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1593013
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248914
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5847055
Group-logo
跟我学Nginx+Lua开...
浏览量:697960
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:780294
社区版块
存档分类
最新评论

【第六章】 AOP 之 6.9 代理机制 ——跟我学spring3

阅读更多

Spring AOP通过代理模式实现,目前支持两种代理:JDK动态代理、CGLIB代理来创建AOP代理,Spring建议优先使用JDK动态代理。

  • JDK动态代理:使用java.lang.reflect.Proxy动态代理实现,即提取目标对象的接口,然后对接口创建AOP代理。
  • CGLIB代理:CGLIB代理不仅能进行接口代理,也能进行类代理,CGLIB代理需要注意以下问题:

       不能通知final方法,因为final方法不能被覆盖(CGLIB通过生成子类来创建代理)。

       会产生两次构造器调用,第一次是目标类的构造器调用,第二次是CGLIB生成的代理类的构造器调用。如果需要CGLIB代理方法,请确保两次构造器调用不影响应用。

 

Spring AOP默认首先使用JDK动态代理来代理目标对象,如果目标对象没有实现任何接口将使用CGLIB代理,如果需要强制使用CGLIB代理,请使用如下方式指定:

对于Schema风格配置切面使用如下方式来指定使用CGLIB代理:

 

java代码:
<aop:config proxy-target-class="true">
</aop:config>

 

而如果使用@AspectJ风格使用如下方式来指定使用CGLIB代理:

 

java代码:
<aop:aspectj-autoproxy proxy-target-class="true"/>

 

 

 

 

分享到:
评论
5 楼 zhangdasan 2014-07-16  
楼主,关注你的博客很久了。现在AOP遇到一个问题,请指教。
我用Spring的Bean、AOP都是用注解的方式时不能生成CGlib代理,也不能拦截。但是仅仅将被拦截的Bean使用XML的<bean>标签声明代替@Service声明就可以正常生成代理并拦截。请问大概是哪儿的问题呢?

我在applicationContext.xml中配置为:
<aop:aspectj-autoproxy proxy-target-class="true"/>
<context:component-scan base-package="com.sam.demo.web"/>
具体更多细节在http://www.oschina.net/question/1984063_161675

谢谢。
4 楼 jinnianshilongnian 2013-07-30  
kjmmlzq19851226 写道
jinnianshilongnian 写道
kjmmlzq19851226 写道
Spring AOP默认首先使用JDK动态代理来代理目标对象,如果目标对象没有实现任何接口将使用CGLIB代理
e.g.
A为一接口,B为一抽象类实现了A,C为B的子类。
如果C被JDK动态代理了,会不会有问题?因为C毕竟没有实现A,除此之外,这种情况AOP代理会不会自动使用CGLIB代理?

只要有接口,默认就是代理这个接口,C间接实现了A也是实现了。

试验了一把,的确是jdk代理,无意之间又发现个问题
B b = (B) applicationcontext.getBean(c.name);报个类型转换异常
java.lang.ClassCastException: $Proxy12 cannot be cast to B
有点儿没头绪了

估计B是实现,因为代理的是接口,所以只能转换为接口;

仔细思考下JDK动态代理,是接口的代理
3 楼 kjmmlzq19851226 2013-07-30  
jinnianshilongnian 写道
kjmmlzq19851226 写道
Spring AOP默认首先使用JDK动态代理来代理目标对象,如果目标对象没有实现任何接口将使用CGLIB代理
e.g.
A为一接口,B为一抽象类实现了A,C为B的子类。
如果C被JDK动态代理了,会不会有问题?因为C毕竟没有实现A,除此之外,这种情况AOP代理会不会自动使用CGLIB代理?

只要有接口,默认就是代理这个接口,C间接实现了A也是实现了。

试验了一把,的确是jdk代理,无意之间又发现个问题
B b = (B) applicationcontext.getBean(c.name);报个类型转换异常
java.lang.ClassCastException: $Proxy12 cannot be cast to B
有点儿没头绪了
2 楼 jinnianshilongnian 2013-07-29  
kjmmlzq19851226 写道
Spring AOP默认首先使用JDK动态代理来代理目标对象,如果目标对象没有实现任何接口将使用CGLIB代理
e.g.
A为一接口,B为一抽象类实现了A,C为B的子类。
如果C被JDK动态代理了,会不会有问题?因为C毕竟没有实现A,除此之外,这种情况AOP代理会不会自动使用CGLIB代理?

只要有接口,默认就是代理这个接口,C间接实现了A也是实现了。
1 楼 kjmmlzq19851226 2013-07-26  
Spring AOP默认首先使用JDK动态代理来代理目标对象,如果目标对象没有实现任何接口将使用CGLIB代理
e.g.
A为一接口,B为一抽象类实现了A,C为B的子类。
如果C被JDK动态代理了,会不会有问题?因为C毕竟没有实现A,除此之外,这种情况AOP代理会不会自动使用CGLIB代理?

相关推荐

    跟我学spring3(1-7)

    【第六章】 AOP 之 6.9 代理机制 ——跟我学spring3 【第七章】 对JDBC的支持 之 7.1 概述 ——跟我学spring3 【第七章】 对JDBC的支持 之 7.2 JDBC模板类 ——跟我学spring3 【第七章】 对JDBC的支持 之 ...

    跟开涛学Spring

    1.28 【第六章】 AOP 之 6.9 代理机制 ——跟我学spring3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .284 1.29 【第七章】 对JDBC的支持 之 7.1 概述 ——跟我学spring3 . . . . . . . ....

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

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

    spring之AOP(动态代理)

    spring之AOP(动态代理),包括jdk动态代理和CGLib动态代理

    Spring aop 之 静态代理 动态代理 Aspectj aop-config 等实现方式

    主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...

    跟我学spring3(1-7).pdf

    Spring概述2.1 IoC基础2.2 IoC 容器基本原理2.3 IoC的配置使用——跟我学Spring33.1 DI的配置使用3.2 循环依赖3.3 更多DI的知识 3.4 Bean的作用域 4.1 基础知识4.2 内置Resource实现4.3 访问Resource4.4 Resource...

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

    AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理

    Spring AOP实现机制

    Spring AOP的实现机制中文版,动态代理及原理,自定义类加载器

    spring aop spring aop

    spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop

    spring-aop.jar各个版本

    spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...

    springAOP配置动态代理实现

    springAOP配置实现动态代理,有利于熟悉动态代理原理,深入了解spring。

    跟我学spring3 .pdf

    详细讲解了 IOC DI AOP JDBC MVC 等等spring知识,有很高的学习价值

    开发工具 spring-aop-4.3.6.RELEASE

    开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE...

    Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结

    Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结

    AOP动态代理(反射机制)

    介绍AOP动态代理很不错的一本技术书籍,里面又很多例子通俗易懂。

    springAop默认代理方式.zip

    介绍了springAop默认代理方式

    跟我学spring3

    跟我学spring3,包括spring 对象管理,aop,mvc,resource等,非常详细!

    Spring AOP教程

    Spring框架的关键组件之一是面向方面编程(AOP)框架。 面向方面的编程需要将程序逻辑分解成不同的部分。 此教程将通过简单实用的方法来学习Spring框架提供的AOP/面向方面编程。

    spring aop代理列子

    package com.gc.aop下为:aop方式ProxyFactoryBean代理 package com.gc.aop下为:aop方式ProxyFactoryBean代理 package com.gc.autoproxy下为:aop方式自动代理 package com.gc.cglib下为:aop方式cglib代理 ...

    Spring框架+SpringAOP动态代理

    SpringAOP动态代理 Spring AOP 使用的动态代理主要有两种方式:JDK 动态代理和 CGLIB 代理。 JDK 动态代理:用于代理实现了接口的类。Spring 会使用 java.lang.reflect.Proxy 类来创建代理对象。 CGLIB 代理:用于...

Global site tag (gtag.js) - Google Analytics