1.IoC
1.1 什么是IoC
IoC即控制反转/反转控制。它是一种思想而不是一种技术实现,描述的是:Java开发领域对象的创建以及管理的问题
例如: 现有类A依赖类B
传统开发方式:在类A中通过new关键字来创建一个类B的对象
IoC开发方式: 通过IoC容器(Spring框架)来获取某个实例化对象
1.2 控制反转
控制:指的是对象创建(实例化,管理)的权力
反转:将该权利转让给外部容器
1.3 作用
1. 对象之间的耦合度降低
2. 资源管理变得便利
1.4 IoC和DI有什么区别
DI指的是依赖注入,而依赖注入是IoC最常见的实现方法。
正所谓IoC是一种开发思想,而不是技术实现,在Spring中IoC容器实际上就是通过一个Map来存放各种对象。
2.AOP
2.1 什么是AOP
AOP指的是面向切面编程,是OOP(面向对象编程)的一种延续,二者互补而不冲突。
AOP的目的是将横切关注点(如日志记录、事务管理、权限控制、接口限流、接口幂等等)从核心业务逻辑中分离出来,通过动态代理、字节码操作等技术,实现代码的复用和解耦,提高代码的可维护性和可扩展性。
OOP的目的是将业务逻辑按照对象的属性和行为进行封装,通过类、对象、继承、多态等概念,实现代码的模块化和层次化,提高代码的可读性和可维护性。
2.1 为什么叫面向切面编程
AOP的核心思想就是将横切关注点从核心业务逻辑中分离出来,形成一个个的切面。
AOP的关键术语:
横切关注点:多个类或对象中的公共行为(如日志记录,事务管理,权限控制,接口限流等)。
切面:对横切关注点进行封装的类,一个切面是一个类。切面可以定义多个通知,用来实现具体的功能。
连接点:连接点是方法调用或者方法执行时的某个特定时刻(方法调用,异常抛出等)。
通知:通知就是切面在某个连接点要执行的操作。通知有五个类型:前置通知,后置通知,异常通知,返回通知,环绕通知。前四种通知都是在方法的前后执行,而环绕通知可以控制方法的执行过程
切点:一个切点时一个表达式,它用来匹配哪些连接点需要被切面所增强,切点可以通过注解,正则表达式,逻辑运算等方式定义,如execution(*com.x.service..*(..)匹配com.x.service包及其子包下的类或接口。
织入:织入是切面和目标对象连接起来的过程,也就是通知应用到切点匹配的连接点上,常见的织入点有两种:一是编译期织入,二是运行时织入
2.3 AOP解决了什么问题
OOP不能很好解决分散在多个类或对象中的公共行为(例如:日志记录,事务管理,权限控制等),这些公共行为通常称为横切关注点,而AOP能够将横切关注点从核心代码中分离出来,实现关注点的分离。
2.4 AOP的应用场景
1.日志记录:自定义日志记录注解,利用AOP,一行代码即可实现日志记录。
2.性能统计:利用AOP在目标方法的执行前后统计方法的执行时间,方便优化和分析。
3.事务管理:@Transactional注解可以让Spring为我们进行事务管理,比如回滚异常操作,免去了重复事务管理逻辑,而@Transactional注解就是基于AOP实现的。
4.权限控制:利用AOP在目标方法执行前判断用户是否具备所需要的权限,如果具备,就执行,否则不执行。例如SpringSecurity利用@PreAuthorize注解自定义权限校验
5.接口限流:利用AOP在目标方法执行前通过具体的限流算法和实现请求进行限流处理。
6.缓存管理:利用AOP在目标方法执行前后进行缓存的读取和更新
2.5 AOP的实现方法
1.动态代理
2.字节码操作
3. AspectJ,AOP已经整合了 AspectJ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。
Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。 Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。
标签:事务管理,通知,详解,切面,AOP,IoC,限流 From: https://blog.csdn.net/qq_53429120/article/details/141758301