@@ -36,7 +36,7 @@ IoC (Inversion of Control )即控制反转/反转控制。它是一种思想
36
36
- ** 控制** :指的是对象创建(实例化、管理)的权力
37
37
- ** 反转** :控制权交给外部环境(IoC 容器)
38
38
39
- ![ IoC 图解] ( https://oss.javaguide.cn/java-guide-blog/frc-365faceb5697f04f31399937c059c162 .png )
39
+ ![ IoC 图解] ( https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/IoC&Aop-ioc-illustration .png )
40
40
41
41
### IoC 解决了什么问题?
42
42
@@ -49,17 +49,15 @@ IoC 的思想就是两方之间不互相依赖,由第三方容器来管理相
49
49
50
50
在没有使用 IoC 思想的情况下,Service 层想要使用 Dao 层的具体实现的话,需要通过 new 关键字在` UserServiceImpl ` 中手动 new 出 ` IUserDao ` 的具体实现类 ` UserDaoImpl ` (不能直接 new 接口类)。
51
51
52
- ![ ] ( https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/ioc-kfji3.png )
53
-
54
52
很完美,这种方式也是可以实现的,但是我们想象一下如下场景:
55
53
56
54
开发过程中突然接到一个新的需求,针对` IUserDao ` 接口开发出另一个具体实现类。因为 Server 层依赖了` IUserDao ` 的具体实现,所以我们需要修改` UserServiceImpl ` 中 new 的对象。如果只有一个类引用了` IUserDao ` 的具体实现,可能觉得还好,修改起来也不是很费力气,但是如果有许许多多的地方都引用了` IUserDao ` 的具体实现的话,一旦需要更换` IUserDao ` 的实现方式,那修改起来将会非常的头疼。
57
55
58
- ![ ] ( https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/why -ioc.png )
56
+ ![ IoC&Aop-ioc-illustration-dao-service ] ( https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/IoC&Aop -ioc-illustration-dao-service .png )
59
57
60
58
使用 IoC 的思想,我们将对象的控制权(创建、管理)交由 IoC 容器去管理,我们在使用的时候直接向 IoC 容器 “要” 就可以了
61
59
62
- ![ ] ( https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/why -ioc-2 .png )
60
+ ![ ] ( https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/IoC&Aop -ioc-illustration-dao .png )
63
61
64
62
### IoC 和 DI 有区别吗?
65
63
@@ -87,6 +85,8 @@ AOP 的目的是将横切关注点(如日志记录、事务管理、权限控
87
85
88
86
AOP 之所以叫面向切面编程,是因为它的核心思想就是将横切关注点从核心业务逻辑中分离出来,形成一个个的** 切面(Aspect)** 。
89
87
88
+ ![ 面向切面编程图解] ( https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/aop-program-execution.jpg )
89
+
90
90
这里顺带总结一下 AOP 关键术语(不理解也没关系,可以继续往下看):
91
91
92
92
- ** 横切关注点(cross-cutting concerns)** :多个类或对象中的公共行为(如日志记录、事务管理、权限控制、接口限流、接口幂等等)。
@@ -96,6 +96,16 @@ AOP 之所以叫面向切面编程,是因为它的核心思想就是将横切
96
96
- ** 切点(Pointcut)** :一个切点是一个表达式,它用来匹配哪些连接点需要被切面所增强。切点可以通过注解、正则表达式、逻辑运算等方式来定义。比如 ` execution(* com.xyz.service..*(..)) ` 匹配 ` com.xyz.service ` 包及其子包下的类或接口。
97
97
- ** 织入(Weaving)** :织入是将切面和目标对象连接起来的过程,也就是将通知应用到切点匹配的连接点上。常见的织入时机有两种,分别是编译期织入(Compile-Time Weaving 如:AspectJ)和运行期织入(Runtime Weaving 如:AspectJ、Spring AOP)。
98
98
99
+ ### AOP 常见的通知类型有哪些?
100
+
101
+ ![ ] ( https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/aspectj-advice-types.jpg )
102
+
103
+ - ** Before** (前置通知):目标对象的方法调用之前触发
104
+ - ** After** (后置通知):目标对象的方法调用之后触发
105
+ - ** AfterReturning** (返回通知):目标对象的方法调用完成,在返回结果值之后触发
106
+ - ** AfterThrowing** (异常通知):目标对象的方法运行中抛出 / 触发异常后触发。AfterReturning 和 AfterThrowing 两者互斥。如果方法调用成功无异常,则会有返回值;如果方法抛出了异常,则不会有返回值。
107
+ - ** Around** (环绕通知):编程式控制目标对象的方法调用。环绕通知是所有通知类型中可操作范围最大的一种,因为它可以直接拿到目标对象,以及要执行的方法,所以环绕通知可以任意的在目标对象的方法调用前后搞事,甚至不调用目标对象的方法
108
+
99
109
### AOP 解决了什么问题?
100
110
101
111
OOP 不能很好地处理一些分散在多个类或对象中的公共行为(如日志记录、事务管理、权限控制、接口限流、接口幂等等),这些行为通常被称为 ** 横切关注点(cross-cutting concerns)** 。如果我们在每个类或对象中都重复实现这些行为,那么会导致代码的冗余、复杂和难以维护。
0 commit comments