AOP的基础是Java动态代理

Java中代理的实现一般分为三种:JDK静态代理、JDK动态代理以及CGLIB动态代理。

静态代理:
代理类与被代理类实现同一个接口,在代理类中持有一个被代理对象的引用,而后在代理类方法中调用该对象的方法。 静态代理编译前就需要实现与被代理类相同的接口,动态代理只有运行时才知道针对哪个接口、哪个被代理类创建代理类。 JDK静态代理是通过直接编码创建的,而JDK动态代理是利用反射机制在运行时创建代理类的。
其实在动态代理中,核心是InvocationHandler。 Proxy类中的newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) //创建代理类实例
Class<?> cl = getProxyClass0(loader, intfs);return proxyClassCache.get(loader, interfaces); //产生代理类Class对象
byte[] proxyClassFile = ProxyGenerator.generateProxyClass(proxyName, interfaces, accessFlags); //字节码生成 CGLIB动态代理机制: CGLIB会让生成的代理类继承被代理类,并在代理类中对代理方法进行强化处理(前置处理、后置处理等)。
在CGLIB底层,其实是借助了ASM这个非常强大的Java字节码生成框架。 创建代理对象的几个步骤:
生成代理类的二进制字节码文件;
加载二进制字节码,生成Class对象( 例如使用Class.forName()方法 );
通过反射机制获得实例构造,并创建代理类对象。 CGLIB中,方法的调用并不是通过反射来完成的,而是直接对方法进行调用:
FastClass对Class对象进行特别的处理,比如将会用数组保存method的引用。

AOP 总结

我们传统的编程方式是垂直化的编程,即A–>B–>C–>D这么下去,一个逻辑完毕之后执行另外一段逻辑。
但是AOP提供了另外一种思路,它的作用是在业务逻辑不需要做任何的改动的情况下对业务代码的功能进行增强。
这种编程思想的使用场景有很多,例如事务提交、方法执行之前的权限检测、日志打印、方法调用事件等。 如果有一段逻辑重复的代码:
普通方式,将代码直接写在目标对象中,造成代码冗余。如果Dao有其它实现类,那么必须新增一个类去包装该实现类,这将导致类数量不断膨胀
装饰者方式:输出日志的逻辑还是无法复用(接口的每个方法都需要被装饰),输出日志的逻辑与代码有耦合。
使用装饰器模式可以说是对使用原生代码的一种改进,使用Java代理可以说是对于使用装饰器模式的一种改进。 AOP实现原理:
1. 加载 Bean 定义的时候应该有过特殊的处理
2. getBean() 的时候应该有过特殊的处理 createAopProxy():
对类生成代理使用CGLIB
对接口生成代理使用JDK原生的Proxy
可以通过配置文件指定对接口使用CGLIB生成代理

使用详解

https://www.cnblogs.com/loveer/p/11564728.html

Spring AOP 总结的更多相关文章

  1. 学习AOP之深入一点Spring Aop

    上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...

  2. 学习AOP之认识一下Spring AOP

    心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...

  3. spring aop

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将 ...

  4. spring aop注解方式与xml方式配置

    注解方式 applicationContext.xml 加入下面配置 <!--Spring Aop 启用自动代理注解 --> <aop:aspectj-autoproxy proxy ...

  5. 基于Spring AOP的JDK动态代理和CGLIB代理

    一.AOP的概念  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...

  6. Spring AOP详解

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  7. Spring AOP实例——异常处理和记录程序执行时间

    实例简介: 这个实例主要用于在一个系统的所有方法执行过程中出线异常时,把异常信息都记录下来,另外记录每个方法的执行时间. 用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用Spring AOP的自动 ...

  8. 从零开始学 Java - Spring AOP 实现用户权限验证

    每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就 ...

  9. 从零开始学 Java - Spring AOP 实现主从读写分离

    深刻讨论为什么要读写分离? 为了服务器承载更多的用户?提升了网站的响应速度?分摊数据库服务器的压力?就是为了双机热备又不想浪费备份服务器?上面这些回答,我认为都不是错误的,但也都不是完全正确的.「读写 ...

  10. 从零开始学 Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

随机推荐

  1. POJ1149PIGS

    传送门 貌似是最大流建图优化入门题(可惜我还是不会) 最暴力的建图当然是源点连每个猪圈然后猪圈需要拆成n个点分给每个人这个必定是跑不过的 所以我们可以进行优化 很明显没有被动过的猪圈一直是不变的可以不 ...

  2. Spring 讲解(一 )

    1.如何理解 Spring 框架 简单来说,Spring 是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架. 因为以前写代码的时候,在使用类对象的时候,经常需要实例化创建(new 出来) ...

  3. shell脚本编程测试类型上

    一bash的条件测试 判断某需求是否满足,需要由测试机制来实现.专用的测试表达式需要由测试命令辅助完成测试过程. 评估布尔声明,以便用在条件性执行中.若真,则返回0:若假,则返回1. 测试命令:• t ...

  4. BZOJ 3622: 已经没有什么好害怕的了(二项式反演)

    传送门 解题思路 首先将\(a\),\(b\)排序,然后可以算出\(t(i)\),表示\(a(i)\)比多少个\(b(i)\)大,根据容斥套路,设\(f(k)\)表示恰好有\(k\)个\(a(i)\) ...

  5. JS基础入门篇(三十六)—面向对象( 三 )

    1.class class es6 中 为 关键字用来声明 一个 类 1.只能通过new调用 2.不存在变量提升 3.多个方法之间直接书写,不需要,隔开 4.类的方法是直接定义在类的原型上的 5.定义 ...

  6. 给Android 应用开发者的十个建议(转)

    转:http://news.cnblogs.com/n/138009/#comment 随着移动平台的发展和其应用的不断改善,质量成为决定成败的关键.用户要求他们选择安装的应用响应快.性能好,如果某个 ...

  7. js 对象浅拷贝和深拷贝

    var model={name:"boy",age:13}; var CopyModel=model; console.log(CopyModel.name); model.nam ...

  8. Openstack组件部署 — Keystone功能介绍与认证实现流程

    目录 目录 前文列表 Keystone认证服务 Keystone认证服务中的概念 Keystone的验证过程 简单来说 前文列表 Openstack组件部署 - Overview和前期环境准备 Ope ...

  9. jmeter压测、操作数据库、分布式、 linux下运行的简单介绍

    一.jmeter压测 1.如何压测 常规性能压测:10-15分钟 稳定性测试:一周.2天等 如果想要压测10分钟,勾选永远,勾选调度器,填写600秒.也可以使用固定启动时间. 2.tps.响应时间 ( ...

  10. Redis源码编译安装

    介绍 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统.Redis是一个开源的使用ANSI C语言编写.遵 ...