Spring入门导读——IoC和AOP
和MyBatis系列不同的是,在正式开始Spring入门时,我们先来了解两个关于Spring核心的概念,IoC(Inverse of Control)控制反转和AOP()面向切面编程。
1.IoC(Inversion of Control)控制反转
什么是控制反转呢?可以这么通俗的来解释,我们通常写代码当一个类会关联另一个类是会直接在这个类里new,例如:
1 package day_30_spring; 2 3 /** 4 * @author 余林丰 5 * 6 * 2016年10月30日 7 */ 8 public class People { 9 private Eat eat; 10 11 /** 12 * 在构造方法中创建Eat的对象实例 13 */ 14 public People(){ 15 eat = new Eat(); 16 } 17 18 }
现在我们将对象的控制权“反转”,交由第三方容器进行管理,即交由Spring容器帮我们管理,使得我们不再People代码中与Eat对象紧耦合。在看下面的代码:
1 package day_30_spring; 2 3 /** 4 * @author 余林丰 5 * 6 * 2016年10月30日 7 */ 8 public class People { 9 private Action eat; 10 11 /** 12 * 在构造方法中创建Eat的对象实例 13 */ 14 public People(Action eat){ 15 this.eat = eat; 16 } 17 18 }
Eat类是继承至Action接口的,这实际上就是通过依赖注入(DI,Dependency Inversion)的方式来实现控制反转。通过构造方法来注入。不依赖于具体的Action接口实现,我们只需要传递一个Action接口类进去即可。相比于之前的“传统”代码紧紧的依赖Action的具体实现Eat类,这个代码实际上解了代码的耦合性。Spring有两种构造方式,一种就是我们上面说到的构造器注入,另一种就是set方法注入。所以,IoC的很简单,目的是解耦,手段是通过依赖注入。Spring容器帮我们解决了一切。
2.AOP(Aspect Oriented Programming)面向切面编程
那什么又是面向切面编程呢?如果你有了解过代理模式,那么就对AOP比较容易理解了,AOP的原理实际上也是通过动态代理的方式实现的。我们来看下面这个例子:对数据库的操作前会有日志记录,对数据库的操作完后也会有日志记录,“通常”我们可能会这么写。
1 package day_30_spring; 2 3 /** 4 * @author 余林丰 5 * 6 * 2016年10月30日 7 */ 8 public class People { 9 private Logger logger = new Logger(); 10 11 public void insert(int i){ 12 logger.beforeInsert(); //插入前的日志记录 13 //此处插入一条数据 14 logger.afterInsert(); //插入后的日志记录 15 } 16 }
“单一职责”告诉我们,这样写到底好不好呢?日志记录是People该做的事吗?难道它不应该只负责插入数据的操作吗?正确的做法应该是这么的在People类中只有这几句代码:
1 package day_30_spring; 2 3 /** 4 * @author 余林丰 5 * 6 * 2016年10月30日 7 */ 8 public class People { 9 10 public void insert(int i){ 11 //此处插入一条数据 12 } 13 }
那我们怎么在insert方法中先记录日志呢?我们可以用动态代理来实现,即创建一个代理类的对象实例,Spring也已经为我们做好了这件事,仅仅需要配置一下几句话,即可实现。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans> 3 <!-- 省略其他配置,只配置aop --> 4 <aop:config> 5 <aop:aspect ref="logger"> 6 <aop:pointcut id="insert" expression="execution(* *.insert(..))"/> 7 <aop:befor point-ref="insert" method="beforeInsert"/> 8 <aop:after point-ref="insert" method="afterInsert"/> 9 </aop:aspect> 10 </aop:config> 11 </beans>
事实上我们能实现最开始我们“糟糕”代码的功能了,而且更优美。在这里我们仅仅对IoC和AOP做一个简单的了解,在后面会和MyBatis一样,先学会从第一步配置,再学会怎么用,最后再来了解框架源代码原理等等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?