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

【第六章】 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代理?

相关推荐

    跟开涛学Spring

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

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

    在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...

    spring之AOP(动态代理)

    总结一下,Spring的AOP机制通过JDK动态代理和CGLIB动态代理提供了强大的横切关注点管理功能。开发者可以轻松地定义切面和通知,以实现如日志、事务管理等功能,同时保持核心业务代码的清晰和简洁。在Spring Boot项目...

    跟我学spring3pdf,高清

    《跟我学Spring3》是一本深入浅出的Spring框架学习指南,主要针对Spring 3.x版本进行讲解。这本书旨在帮助初学者和有一定经验的开发者更好地理解和应用Spring框架,提升其在实际开发中的技能。PDF文档提供了清晰的...

    跟我学spring3

    《跟我学Spring3》是一本深入浅出的Spring框架学习指南,主要针对Spring 3.x版本进行详细讲解。Spring作为Java领域最流行的轻量级框架,它的应用广泛且功能强大,涵盖依赖注入、AOP(面向切面编程)、数据访问、Web...

    跟我学spring

    标题“跟我学spring”和描述“spring 的使用,每个知识点和项目中的运用,20章的介绍。”暗示这是一份详细介绍Spring框架使用方法的教程或手册,覆盖了Spring的各个方面,并以实例为导向,深入探讨了每个知识点在...

    开涛 跟我学spring3 pdf+源码

    此外,压缩包中还包括了"跟我学spring3-源码.rar",这是一份配套的Spring3源码,读者可以通过阅读源码加深对Spring内部机制的理解。同时,提供了两个版本的"跟我学spring3-项目源码(pointShop)",分别是基于XML...

    跟我学spring3(总共13章)8

    《跟我学Spring3》系列教程是为初学者和有经验的开发者提供的一份全面而深入的Spring框架学习资源。Spring3作为Java企业级应用开发的重要框架,它的核心特性包括依赖注入、AOP(面向切面编程)、数据访问、Web开发等...

    跟我学spring3(总共13章)6

    《跟我学Spring3》是针对初学者和有一定基础的开发者设计的一套全面、深入的教程,旨在帮助读者理解和掌握Spring3框架的核心概念和技术。本教程共计13个章节,覆盖了Spring3.0和3.x版本的主要特性。下面将详细阐述第...

    跟我学spring3(1-13)

    《跟我学Spring3》是一本深入浅出介绍Spring框架的电子书,分为两部分,分别是“跟我学Spring3(8-13).pdf”和“跟我学Spring3(1-7).pdf”,全面覆盖了Spring框架的核心概念和技术。Spring作为Java开发中的主流框架,...

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

    在Java开发中,反射机制是实现动态代理的关键技术之一。反射提供了在运行时访问和操作类的能力,这使得动态代理的实现成为可能。在Java中,可以使用java.lang.reflect包下的相关类和接口实现动态代理。 例如,通过...

    跟我学Spring3

    《跟我学Spring3》这本书是针对Java开发人员深入学习Spring框架第三版的一份教程。Spring作为Java企业级应用开发中的核心框架,它以其强大的功能、灵活性和模块化设计深受开发者喜爱。Spring3版本在前一版本基础上...

    Spring AOP实现机制

    **Spring AOP 实现机制详解** Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的...

    跟我学spring3 .pdf

    《跟我学Spring3》这本书是针对Spring框架进行深入解析的一本教程,涵盖了Spring的核心特性,包括IoC(Inversion of Control,控制反转)、DI(Dependency Injection,依赖注入)、AOP(Aspect-Oriented Programming...

    五、Spring源码分析——Spring Aop

    Spring AOP分为两种代理方式:JDK动态代理和CGLIB代理。JDK动态代理基于接口实现,如果目标类实现了接口,Spring会选择JDK动态代理;如果没有实现接口,Spring则会使用CGLIB代理,通过字节码技术创建一个目标类的...

    跟我学spring3(1-7)

    《跟我学Spring3》系列教程涵盖了Spring框架的核心概念和技术,包括IoC(Inversion of Control,控制反转)、DI(Dependency Injection,依赖注入)、资源管理、Spring表达式语言(SpEL)以及面向切面编程(AOP)等...

Global site tag (gtag.js) - Google Analytics