`
gaojingsong
  • 浏览: 1158824 次
  • 性别: 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);

}

}

}

分享到:
评论

相关推荐

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

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

    Spring框架研究与探讨

    本文对Spring框架中所包含的AOP思想以及事务管理进行了分析,并通过对一个业务对象实现加锁/解锁的操作,说明 了动态代理模式的可行性与有效性。 Aspect Oriented Programming(AOP)是近年来计算机技术中比较...

    Spring in Action(第2版)中文版

    a.1.1研究spring发布 a.1.2构建自己的类路径 a.2把spring添加为一个maven2依赖项 a.3spring与ant a.4spring与log4j 附录b用(和不用)spring进行测试 b.1测试简介 b.1.1理解不同类型的测试 b.1.2使用junit b....

    Spring in Action(第二版 中文高清版).part2

    A.1.1 研究Spring发布 A.1.2 构建自己的类路径 A.2 把Spring添加为一个Maven 2依赖项 A.3 Spring与Ant A.4 Spring与Log4j 附录B 用(和不用)Spring进行测试 B.1 测试简介 B.1.1 理解不同类型的测试 B.1.2 ...

    Spring in Action(第二版 中文高清版).part1

    A.1.1 研究Spring发布 A.1.2 构建自己的类路径 A.2 把Spring添加为一个Maven 2依赖项 A.3 Spring与Ant A.4 Spring与Log4j 附录B 用(和不用)Spring进行测试 B.1 测试简介 B.1.1 理解不同类型的测试 B.1.2 ...

    spring:这是Spring框架研究

    七、模拟spring(AOP, IOC, DI, BeanPostProcessor及许多常用注解) 八、使用spring FactoryBean技术模拟mybatis MapperScan注解 https://github.com/AvengerEug/spring/tree/develop/implement-mapperscan 九、...

    基于SSM框架图书信息管理系统 | 毕业设计

    5 spring容器内部使用拦截器,以Spring AOP的方式实现事务控制管理。 系统实体对象: 图书类型:图书类别,类别名称,可借阅天数 图书:图书条形码,图书名称,图书所在类别,图书价格,库存,出版社,图书图片

    蓝色简约风毕业答辩PPT

    ②IOC、AOP、代理、切面、循环依赖都是如何设计和实现的。 阅读建议:此资源以开发简化版Spring学习其原理和内核,不仅是代码编写实现也更注重内容上的需求分析和方案设计,所以在学习的过程要结合这些内容一起来...

    积分管理系统java源码-knowledge:这是我的知识,包括我所有已知的

    字符串和String研究 集合内容,List、Map 文件io和网络io bio、nio和aio 类加载器 常用设计模式 模板模式 单例模式 & 多例模式 代理模式 策略模式 原型模式 工厂模式 委托 其他 Spring5 IOC容器设计原理及高级特性 ...

    收集的常见的专业问题解决办法.rar

    2009-02-24 08:36 171617 47585 常见的专业问题解决办法\Spring框架与AOP思想的研究与应用.mht 2009-02-24 08:37 190012 61182 常见的专业问题解决办法\Spring框架快速入门之简介.mht 2009-01-16 08:16 281434 ...

    asp.net知识库

    技术基础 New Folder 多样式星期名字转换 [Design, C#] .NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 ...

Global site tag (gtag.js) - Google Analytics