Spring AOP 总结
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 总结的更多相关文章
- 学习AOP之深入一点Spring Aop
上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...
- 学习AOP之认识一下Spring AOP
心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...
- spring aop
什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将 ...
- spring aop注解方式与xml方式配置
注解方式 applicationContext.xml 加入下面配置 <!--Spring Aop 启用自动代理注解 --> <aop:aspectj-autoproxy proxy ...
- 基于Spring AOP的JDK动态代理和CGLIB代理
一.AOP的概念 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...
- Spring AOP详解
一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...
- Spring AOP实例——异常处理和记录程序执行时间
实例简介: 这个实例主要用于在一个系统的所有方法执行过程中出线异常时,把异常信息都记录下来,另外记录每个方法的执行时间. 用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用Spring AOP的自动 ...
- 从零开始学 Java - Spring AOP 实现用户权限验证
每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就 ...
- 从零开始学 Java - Spring AOP 实现主从读写分离
深刻讨论为什么要读写分离? 为了服务器承载更多的用户?提升了网站的响应速度?分摊数据库服务器的压力?就是为了双机热备又不想浪费备份服务器?上面这些回答,我认为都不是错误的,但也都不是完全正确的.「读写 ...
- 从零开始学 Java - Spring AOP 拦截器的基本实现
一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...
随机推荐
- Python文件读写(一)
import time as t from os import path def createFile(dest): date = t.localtime(t.time()) name = '%d_% ...
- Mac 终端SSH连接服务器
1.打开终端 2.看是否是处于root目录下,是看第3步:否则执行sudo -i,输入电脑密码 3.执行 ssh root@host(host:ip地址或者域名) 4.如果不是第一次,则已成功连接.第 ...
- BlueStore-先进的用户态文件系统《二》-BlueFS
https://zhuanlan.zhihu.com/p/46362124 简介 上一篇文章中,介绍了BlueStore的诞生背景.逻辑架构以及设计思想,提到了在BlueStore中元数据都是存放在R ...
- POJ 1321 棋盘问题(dfs入门)
Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...
- 二进制&八进制&十六进制之间的快速转换------ 心算&笔算方法总结
二进制数 0&1两种元素: 8进制数 0-7 八种元素: 十六进制数 0-9,a,b,c,d,e, ...
- 【从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统】06、Mybatis+SQLServer集成
1.增加POM依赖 注意pagehelper插件,我重写过,可以到我的这篇文章了解https://www.cnblogs.com/LiveYourLife/p/9176934.html <dep ...
- 修改Mysql数据库的字符集
1.先检查数据库的默认字符集是否是引起不能存储中文的原因: 登录数据库后执行下面的命令 mysql> show variables like 'character%'; 由上图可以看出,data ...
- 软件-平面设计-CorelDRAW:CorelDRAW
ylbtech-软件-平面设计-CorelDRAW:CorelDRAW CorelDRAW Graphics Suite是加拿大Corel公司的平面设计软件:该软件是Corel公司出品的矢量图形制作工 ...
- HTML-参考手册: HTML 符号实体
ylbtech-HTML-参考手册: HTML 符号实体 1.返回顶部 1. HTML 符号实体 本字符实体参考手册包括了数学符号.希腊字符.各种箭头记号.科技符号以及形状. 注释: 实体名称对大小写 ...
- PAT_A1097#Deduplication on a Linked List
Source: PAT A1097 Deduplication on a Linked List (25 分) Description: Given a singly linked list L wi ...