当前位置: 首页 > news >正文

AOP 面向切面编程

AOP(Aspect Orient Programming) 面向切面编程是通过运行期动态代理实现程序功能的统一维护的一种技术,从动态角度考虑程序运行的。

AOP底层就是采用动态代理模式实现的,采用了两种代理:JDK动态代理与CGLIB

利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各个部分之间的耦合度降低,提高程序的可重用性,同时提高了开发效率。

面向切面编程就是将交叉业务逻辑封装成切面,利用AOP容器的功能将切面织入到主业务逻辑中。所谓交叉业务逻辑是指,通用的与主业务无关的逻辑代码,如安全检查、事务、日志、缓存等。

若不使用AOP则会出现代码纠缠,即交叉业务逻辑与主业务逻辑混合在一起,这样会使主业务逻辑变得混杂不清。

1、动态代理

实现方式:jdk动态代理,使用jdk中的Proxy, Method, InvocationHandler创建代理对象

jdk动态代理要求目标类必须实现接口

cglib动态代理:第三方的工具库,创建代理对象,原理是继承。通过继承目标类,创建子类。子类就是代理对象。要求目标类不能是final,方法也不能是final

2、动态代理的作用

  • 在目标类源代码不改变的情况下增加功能
  • 减少代码的重复
  • 专注业务逻辑代码
  • 解耦合,让业务功能和日志、事务等非业务功能分离

3、AOP :面向切面编程,基于动态代理,可以使用jdk、cglib两种代理方式

AOP 就是动态代理的规范化(把动态代理的实现步骤和方式都定义好了,让开发人员用一种统一的方式使用动态代理)

Aspect : 切面,给目标类增加功能就是切面(像日志、事务);特点(一般是非业务方法,可以独立使用)

术语:

  • Aspect : 切面,表示增强的功能,就是一对代码完成某一个功能,非业务功能,常见的切面功能有日志、事务、统计信息、参数检查、权限验证
  • JointPoint:连接点,连接业务方法和切面的位置(某类中的业务方法)
  • PointCut: 切入点,指多个连接点方法的集合,多个方法
  • Advice: 通知,通知表示切面功能的执行的时间

怎么理解面向切面编程?

  • 需要早分析项目功能时,找出切面
  • 合理的安排其切面的执行时间(在目标方法前,还是在目标方法后)
  • 合理的安排切面执行的位置,在哪个类,哪个方法增加增强功能

aspectJ:一个开源的专门做AOP的框架,spring中集成了aspectJ,通过spring就能使用aspectJ的功能。

aspectJ实现AOP有两种方式:

1.使用XML 的配置文件:配置全局事务

2.使用注解,在项目中做AOP功能一般使用注解

@Before、

@AfterReturning、

@Around 、

@AfterThrowing、

@After

创建切面类

在类的上面加入@Aspect

  • 在类中定义方法,方法就是切面要执行的功能代码
  • 在方法的上面加入aspectj中的通知注解,例如@Before
  • 有需要指定切入点表达式execution()

创建spring配置文件:声明对象,把对象交给容器统一管理,声明对象可以使用注解或者xml配置文件

  • 声明目标对象
  • 声明切面对象
  • 生命aspectj框架中的自动代理生成器标签,自动代理生成器:用来完成代理对象的自动创建功能

 

相关文章:

  • Python-爬虫、自动化(selenium,动态网页翻页,模拟搜索,下拉列表选择、selenium行为链)
  • 关联规则代码实现
  • Redis 键(key)相关操作和常用命令
  • 大模型系统和应用——Prompt-learning Delta Tuning
  • Python自动化小技巧07——符号计算求方程解、二重积分
  • js获取本周的周一、周日和上周的周一、周日
  • 基于Php幼儿园管理系统
  • 基于Spring Boot+MySQL的半自动标注系统(人、车、人脸的自动检测)设计与实现
  • 置顶汇总:OpenGL图形学、Shader进阶、Android-RTC视频处理、学术讨论群。
  • SpringBoot项目配置postgresql数据库(配置多数据源)
  • idea分析栈帧链
  • IAR9.30以上版本安装、注册、新建工程和配置过程详细介绍
  • UML测试题(用例图基础b)
  • kvm虚拟机基本管理和网络管理
  • 从零实现深度学习框架——衡量算法的基本指标
  • 【剑指offer】让抽象问题具体化
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • emacs初体验
  • java中的hashCode
  • js算法-归并排序(merge_sort)
  • js中forEach回调同异步问题
  • node和express搭建代理服务器(源码)
  • PAT A1120
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • webgl (原生)基础入门指南【一】
  • 分布式事物理论与实践
  • 浅谈Golang中select的用法
  • 如何在GitHub上创建个人博客
  • 小程序button引导用户授权
  • 用element的upload组件实现多图片上传和压缩
  • 终端用户监控:真实用户监控还是模拟监控?
  • k8s使用glusterfs实现动态持久化存储
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • (2020)Java后端开发----(面试题和笔试题)
  • (超详细)语音信号处理之特征提取
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (定时器/计数器)中断系统(详解与使用)
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (学习日记)2024.01.09
  • (转)VC++中ondraw在什么时候调用的
  • (转)创业的注意事项
  • (转)详解PHP处理密码的几种方式
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET Core 项目指定SDK版本
  • .Net MVC4 上传大文件,并保存表单
  • .NET 服务 ServiceController
  • ::before和::after 常见的用法
  • :“Failed to access IIS metabase”解决方法
  • @GetMapping和@RequestMapping的区别
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [2016.7 test.5] T1
  • [BZOJ2850]巧克力王国