`
gaojingsong
  • 浏览: 1200824 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【Spring AOP代理研究】

 
阅读更多

JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。

CGlib动态代理:利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

 

区别:JDK代理只能对实现接口的类生成代理;CGlib是针对类实现代理,对指定的类生成一个子类,并覆盖其中的方法,这种通过继承类的实现方式,不能代理final修饰的类

 

 

1、JDK代理使用的是反射机制实现aop的动态代理,CGLIB代理使用字节码处理框架asm,通过修改字节码生成子类。

    所以jdk动态代理的方式创建代理对象效率较高,执行效率较低,cglib创建效率较低,执行效率高;

 

2.JDK动态代理机制是委托机制,具体说动态实现接口类,在动态生成的实现类里面委托hanlder去调用原始实现类方法,CGLIB则使用的继承机制,具体说被代理类和代理类是继承关系

     所以代理类是可以赋值给被代理类的,如果被代理类有接口,那么代理类也可以赋值给接口。

 

 

JDK动态代理依赖Proxy类和InvocationHandler接口,必须实现接口类才可以代理

CgLib需要实现MethodInterceptor接口

 

 

Spring AOP 框架对 AOP 代理类的处理原则是:如果目标对象的实现类实现了接口(上述代码中的if (targetClass.isInterface() || Proxy.isProxyClass(targetClass))),Spring AOP 将会采用 JDK 动态代理来生成 AOP 代理类;如果目标对象的实现类没有实现接口,Spring AOP 将会采用 CGLIB 来生成 AOP 代理类

public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {

 

@Override

public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {

if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {

Class<?> targetClass = config.getTargetClass();

if (targetClass == null) {

throw new AopConfigException("TargetSource cannot determine target class: " +

"Either an interface or a target is required for proxy creation.");

}

if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {

return new JdkDynamicAopProxy(config);

}

return new ObjenesisCglibAopProxy(config);

}

else {

return new JdkDynamicAopProxy(config);

}

}

}

分享到:
评论

相关推荐

    Spring AOP的底层实现技术

    4. **AOP代理的创建** Spring AOP在启动时会根据配置创建代理对象。如果目标类实现了接口,将使用JDK动态代理;否则,使用CGLIB代理。代理对象在调用目标方法时会插入通知逻辑。 5. **代理对象的工作原理** 当...

    Spring AOP 2.0 研究

    **Spring AOP 2.0 研究** 在软件开发中,面向切面编程(Aspect-Oriented Programming,简称AOP)是一种重要的设计模式,它允许开发者将关注点从核心业务逻辑中分离出来,例如日志记录、事务管理、性能监控等。...

    Spring AOP实现 项目源码 Myeclipse 直接导入可用

    6. **目标对象(Target Object)**: 被AOP代理的对象,即包含了切面逻辑的业务对象。 7. **代理(Proxy)**: 代理是Spring AOP的核心,它在目标对象周围创建一个包装器,以提供切面的功能。Spring支持JDK动态代理和...

    Spring AOP实例

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个...通过研究这些源码,你可以深入理解如何在实际项目中应用Spring AOP,实现模块化的关注点处理,并提高代码的可维护性和复用性。

    设计模式之动态代理与spring的aop编程

    同时,你也可以寻找与Spring AOP相关的配置或示例,了解如何定义切面、通知和切入点,以及如何在Spring上下文中启用AOP代理。 总之,动态代理和Spring AOP是Java开发中强大的工具,它们能帮助我们构建更灵活、可...

    SpringAop.zip

    在深入研究"SpringAop.zip"的内容之前,确保你已经安装了Spring框架和IntelliJ IDEA,并熟悉基本的Spring配置和编程。通过学习这个示例项目,你可以更直观地理解Spring AOP的工作原理及其在实际开发中的应用。

    spring-aop-4.2.6.RELEASE.zip

    3. **智能代理增强**:Spring AOP可以自动创建JDK动态代理或CGLIB代理,根据目标对象是否实现了接口来决定,这使得AOP能在各种情况下无缝工作。 4. **事务管理**:Spring AOP在事务管理方面有着出色的表现,可以...

    Spring AOP快速入门_源码

    本压缩包中的"Spring-AOP"文件可能包含了示例代码和jar包,可以用来进一步研究和实践Spring AOP的使用。通过阅读源码,你可以深入理解Spring AOP的内部实现机制,这对于成为一位精通Spring框架的开发者至关重要。

    SpringAOP的实现机制(底层原理)、应用场景等详解,模拟过程的实例

    这两种代理方式在Spring AOP中起到关键作用,用于实现横切关注点的切面编程。通过学习它们的原理和实际应用,您将能够更好地理解和利用Spring AOP来提高您的应用程序的可维护性和可扩展性。 内容亮点: JDK动态...

    研究下Spring中AOP的实现?

    Spring AOP有两种实现方式:代理模式和注解驱动。代理模式分为JDK动态代理和CGLIB代理。JDK动态代理适用于实现了接口的目标对象,它通过实现InvocationHandler接口创建代理对象。而CGLIB代理则是在运行时为类生成...

    Spring aop、jdbc和事务tx练习

    Spring AOP通过代理模式实现,可以是JDK动态代理或CGLIB代理。 2. **Spring JDBC(Java Database Connectivity)** Spring JDBC模块简化了数据库操作,提供了一种统一的API来处理多种数据库。它封装了JDBC的低级...

    Spring AOP 入门实例

    标签“源码”提示我们可以深入研究Spring AOP的源代码,了解其内部工作机制,这对于提升我们的编程技能和理解Spring框架的工作原理非常有帮助。而“工具”标签可能暗示我们可以利用IDE或其他辅助工具来更高效地开发...

    spring Aop的一个小示例

    4. **启用AOP代理**:最后,在Spring的主配置文件中,我们需要启用AOP代理,这可以通过`&lt;aop:aspectj-autoproxy&gt;`元素完成: ```xml &lt;aop:aspectj-autoproxy/&gt; ``` 这样,每当匹配到`serviceMethods`切点的任何...

    aop_log.rar_spring aop

    在Java Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许程序员将关注点分离,比如日志、事务管理等,从核心...通过研究和学习这个例子,开发者可以更好地理解和掌握Spring AOP在日志记录方面的应用。

    AOP.rar-Spring-AOP源码Demo

    Spring AOP,即Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成...在研究源码时,建议先了解相关概念,然后逐步深入代码细节,结合调试工具进行跟踪分析,这将有助于你成为Spring AOP的专家。

    Spring AOP 代码

    **Spring AOP 概述** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了在不...结合提供的`SpringAop`文件,你可以进一步研究和实践Spring AOP的具体实现和应用。

    spring aop

    文件“SpringAOP3”可能是相关的代码示例或者案例研究,可能包含了如何创建和应用切面、定义通知和切入点的代码片段。这部分内容有助于读者通过实际操作加深对Spring AOP的理解。 总的来说,Spring AOP是Spring框架...

    Spring AOP剖析

    6. **代理(Proxy)**:Spring AOP通过代理模式来实现切面的功能。有两种类型的代理:JDK动态代理和CGLIB代理。JDK代理用于实现接口的目标对象,而CGLIB代理则用于没有实现接口的类。 7. **配置AOP**:在Spring中,...

    my-spring.rar-Spring-AOP源码Demo

    总结来说,"my-spring.rar-Spring-AOP源码Demo"提供了学习和研究Spring AOP的实例,涵盖了切面、通知、切入点等核心概念,通过分析源码,开发者能够深入理解Spring AOP的工作机制,并能将其应用于实际的项目开发中。

    Spring-AOP练习源码

    Spring AOP有两种代理模式:JDK动态代理和CGLIB代理。如果目标对象实现了接口,Spring将使用JDK动态代理;否则,它会使用CGLIB生成一个子类来实现切面功能。 5. **自动代理(Auto Proxy)**: Spring可以自动检测...

Global site tag (gtag.js) - Google Analytics