浅谈spring aop的实现原理和实现过程
1.通俗的理解 (职责拆分,高聚合)
AOP
即Aspect Oriented Programming
,面向切面编程,AOP呢是通过分离应用的业务逻辑与系统级服务代码,达到职责拆分,功能提取,即高内聚的一个目的,应用对象只关注它们应该做的,即业务逻辑,而非业务相关的代码,如记录日志或事物支持等,脱离主业务代码,抽离成一个单独的切面类,从而在代码运行时动态地嵌入到我们的代码中,以实现编写时代码拆分,代码高内聚,运行时代码整合,功能保证齐全的目的。
实例: 在一个业务系统中,用户登录是一个基础功能,凡是涉及到用户的业务流程都要求登录,如果把登录功能代码写入到每一个业务流程中,就会显得代码的冗余,维护的时候也是很麻烦的。最好的办法就是吧代码抽离出来,形成独立的模块(拦截器),当业务流程需要的时候,系统会把登录功能自动切入到业务中,这就是一个AOP的体现 。
2.AOP的概念
AOP
是spring
提供的关键特性之一。AOP即是面向切面编程,是OOP
编程的有效补充。使用AOP
技术,可以将一些系统性相关的编程工作,独立提取出来,然后通过切面进入系统,从而避免在业务逻辑代码的中混入很多的系统相关的逻辑–比如权限控制、事务管理、日志记录等等。这些系统的编程工作可以通过独立的代码实现,然后通过AOP
技术切入系统既可以。从而到达了讲不同的关注点分类出来的效果。
- Join point(接入点)
- Advice (通知)
- PointCut(切入点)
- Aspect(切面)
- Target Object(目标对象)
- AOP proxy (AOP代理)
- weaving (织入):是将切面应用到目前对象的过程,这个过程可以是在编译时
3.AOP的实现原理
AOP
分为静态AOP
和动态AOP
。静态AOP
指的是Aspect
实现的AOP
,他是将切面代码直接编译到java
类文件中。动态AOP是将切面代码进行动态织入实现的AOP
。spring
的AOP
为动态AOP
,实现的技术为:JDK
提供的动态代理结束和CGLIB
(动态字节码增强技术)。尽管实现的技术不一样,但都是基于动态代理模式。都是生成一个代理对象。
4.AOP的实际目的
就是在开发的工程中 专一开发就行 最后交由spring
进行代码增强
5.什么是代理
代理是一种设计模式,提供了简介对目标对象进行访问的方式,即通过代理对象访问目标对象,这样的好处是:可以在目标对象实现的功能上,增加额外的功能补充,即扩展目标对象的功能。
这就符合了设计模式的开闭原则,即在对既有的代码不改动的情况下进行功能的扩展。
6. JDK代理和CGLIB代理原理、区别
如果目标对象为接口使用JDK代理 否则使用CGLIB
代理
- Spark调优
- perl语言十分钟入门【零基础可入】
- Spark硬件配置推荐
- Spark作业调度
- 如何把Photoshop改造成远程控制工具(RAT)来利用
- Office高级威胁漏洞在野利用分析
- 10行代码告诉你,为什么说Python数据可视化是一件艺术品
- 没想到你是这样的Linux | 终端下有趣的命令合集
- PhEmail:基于Python的开源网络钓鱼测试工具
- 数据库中间件mysql-proxy细节【mysql官方的中间件】
- Office CVE-2017-8570远程代码执行漏洞复现
- Java 并发包中的读写锁及其实现分析
- 深入理解 Spring 事务原理
- Chrome开发者工具的小技巧
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 完全图解 HTTPS
- TypeScript里的完整函数定义语法
- TypeScript里的类型为any和泛型的区别
- 乐观锁、悲观锁,这一篇就够了!
- 面向切片编程(AOP)应用的一些实际例子
- 计数计量单位KMGTPEZY【计算机】【天文】
- 不用临时的变量 优雅、高效的交换两个数方法
- SAP offline OData插件的JavaScript代码是如何调用到Android平台的Java代码的
- 一个占据SAP BSP应用占据存储空间的小工具
- 基于Golang的逃逸分析(Language Mechanics On Escape Analysis)
- SAP数据库表DDLOG的设计原理
- SAP UI5框架Component.js里extend函数的实现原理
- 冒泡排序的终极改进优化
- alpine安装sshd/ssh server
- 使用jstack检测Java应用的死锁(deadlock)状态