Spring的IOC和AOP,学不会Spring的,你看我的文章
哈喽大家好,我是自学java的码小胡。我学习路线可能和大家都不太一样,在学习spring家族中,就直接学习了SpringBOOT,AlibabaSpringCloud,以及高速缓冲器Redis,消息队列RabbitMQ。
对没错我跳过了枯燥的Spring知识。今天我回头来学习spring,只要认真学习Spring很多概念都很好理解,比如IOC控制反转、AOP面向切面编程等等概念。来看看我的理解吧:
SpringIOC引入
在讲spring之前,我们可以先弄懂一词 “高耦合” 是什么意思呢?
我自己将高耦合理解为 “牵一发而动全身” 。也就是说只要某个地方发生了改变,连带着很多地方都会发生改变。这就是我理解的高耦合。
那么在代码中是如何体现高耦合呢?那我们看一段非常熟悉的代码:
---数据代码实现:---
public class BookDaoImpl implements BookDao{
public void save(){
Systemctl.out.println("coding ma xioa hu .....1");
}
}
---业务层实现:---
public class BookServiceImpl implements BookService{
private BookDao bookDao = new BookDaoImpl();
public void save(){
bookDao.save();
}
}
数据层代码发生了变化:
---如果数据层代码发生变化,业务层怎么办呢?----
public class BookDaoImpl2 implements BookDao{
public void save(){
Systemctl.out.println("coding ma xioa hu...2 ");
}
}
数据层代码发生了变化怎么办呢???
那业务层的代码也要跟着动:private BookDao bookDao = new BookDaoImpl2();
那么这就是高耦合。
源代码发生了变化,就要重新编译、重新测试。
那么怎样才能降低耦合度呢???
spring的作用出现了:
spring容器IOC
问题:耦合度高
解决方法 :使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象。 从而达到解耦。
IOC控制反转:使用对象时,由主动new产生对象,转换为由外部(IOC)提供对象,此过程中对象的创建控制权由程序转移到外部。这种思想叫做控制反转。
IOC容器:就是用来充当IOC思想中的“外部”。IOC容器负责对象的创建、初始化等一些列工作,
Bean:IOC容器 创建或管理的对象统称为Bean
问题又来了:在程序中,service是需要调用dao。其中两者是有关系的,关系怎么办呢?
DI:依赖注入:在容器中建立Bean与Bean之间的依赖关系的整个过程,称为依赖注入。
总结:IOC/Bean/DI
IOC控制反转:当使用对象时,由主动new产生对象,转换为由外部(IOC)提供对象,此过程中对象的创建控制权由程序转移到外部。这种思想叫做控制反转。
IOC容器: IOC容器负责创建对象
Bean: IOC容器创建的对象,称之为“Bean”
DI: DI来绑定容器中的Bean之间的关系
二、AOP
OOP(Object Oriented Programming)面向对象编程。
OOP作用: 是做类、做对象、继承封装多态。
AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构。
AOP作用:在不惊动原始设计的基础上为其进行功能增强。 这就是spring理念:无侵入式编程。
而不管AOP还是OOP都是一种编程思想。
AOP的概念
通俗理解AOP
先找到程序的共性功能,进行抽取出来,写在通知类 。
在通知类中定义方法叫通知方法。
通知方法的作用是: 完成共性功能。
找到需要执行通知方法的方法,定义成切入点 。切入点就是匹配某些通知方法。
连接点是所有方法。
切入点和通知方法绑定后得到切面
切面就是: 在哪个切入点上面执行哪些通知
正式理解AOP:
- 代理(Proxy):SpringAOP的核心本质是采用代理模式实现的。
- 连接点(JoinPoint):程序执行过程中的任意位置,粒度为(其中可以是:)执行方法、抛出异常、设置变量等。
- 在SpringAOP中,理解为方法的执行
- 切入点(Pointcut):匹配连接点的式子
- 在SpringAOP中,一个切入点可以只描述一个具体方法,也可以匹配多个方法
- 通知(Advice):在切入点处执行操作,也就是共性功能。
- 在SpringAOP中,功能最终以方法的形式呈现
- 通知类: 定义通知的类
- 切面(Aspect):描述通知与切入点的对应关系。也就是说:切面描述的是,执行位置和共性功能的关系。
- 目标对象(Target) :被代理的原始对象成为目标对象
AOP总结:
AOP全称叫做 Aspect Oriented Programming 面向切面编程。它是为解耦而生的,解耦是程序员编码开发过程中一直追求的境界,AOP在业务类的隔离上,绝对是做到了解耦。
任何一个系统都是由不同的组件组成的,每个组件负责一块特定的功能,当然会存在很多组件是跟业务无关的,例如日志、事务、权限等核心服务组件,这些核心服务组件经常融入到具体的业务逻辑中,如果我们为每一个具体业务逻辑操作都添加这样的代码,很明显代码冗余太多。
因此我们需要将这些公共的代码逻辑抽象出来变成一个切面,然后注入到目标对象(具体业务)中去,AOP正是基于这样的一个思路实现的,通过动态代理的方式,将需要注入切面的对象进行代理,在进行调用的时候,将公共的逻辑直接添加进去,而不需要修改原有业务的逻辑代码,只需要在原来的业务逻辑基础之上做一些增强功能即可。