谈谈 IOC 和 AOP

前言

我之前面试的时候,真的会有面试官问这个。我感觉确实这个比较高频,因为 Spring 框架最核心的就是这两个东西嘛,掌握了这两个就相当于掌握了 Spring 的半壁江山了。

不过一般面试官不会一上来就问你什么是 AOP 和 IOC,一般都是叫你谈谈 Spring,这时候你就可以从这两个东西去谈了。之前对于这个题目我回答的不算好,所以今天花时间整理了一下应该如何回答。

IOC 控制反转

IOC ,中文名字控制反转,顾名思义就是控制和反转。意思是“对象的创建”这种控制由程序员反转到一个叫 Spring IOC 的容器中。事实上,IOC 只是一种思想而已,这种思想是通过依赖注入的方式实现的。

我们知道每个类中都有很多个对象,而每个类其实都是互相有联系的,因为只有类与类之间互相有联系,才可以实现更强大的功能。由于类之间互相有联系,则不同类的对象很可能也是互相关联的。假如现在我想要一个类的 对象A 关联另一个类的 对象B,该怎么办呢?在不引入 SpringIOC 之前,我们就是直接将 对象A 指向 对象B,但是如果这样,那 A 和 B 就紧耦合了。我们肯定不希望这样子写代码,因为这样写出来的代码太糟糕了,你一旦对其中一个对象做点啥,另一个对象就要跟着动代码,那这是我们不希望看到的,可扩展性太差了。为了解决这个问题,我们引入了SpringIOC,它的作用就是帮我们描述两个对象的关系,假如 对象A 想使用 对象B,不需要在自己的代码里引用 对象B,而是通过 @autowired 注入对象B既可,这样就实现了 对象A 和 对象B 的解耦。

举个例子,平时我们在做项目的时候,比如 controller 层,service 层,dao 层这种,你不会看到controller,service 层会 new 一个对象这种代码,这种描述对象之间关系这种代码是由 Spring IOC 去做的,如果 controller 层想要用 service 层的对象的时候,controller 就会用 @autowired 注入 service 层的一些对象,就像打针一样注入给 controller 层。这样,controller 层和 service 层就实现了解耦,这样代码的可维护性就会很强。

所以说,Sping 中用了依赖注入的方式实现了控制反转的思想,使得不同类的对象之间能够共同完成复杂的功能的同时,还保证了松耦合。

AOP 面向对象编程

AOP,中文名字面向切面编程,这是 Spring 中一种非常重要的思想。我们还是举个例子说明Spring AOP。

我们知道一个系统中有很多模块,每个模块都有业务代码和非业务代码,假如我们把这些业务代码和非业务代码都写在一起,那太糟糕了。怎么办呢?我们把这些非业务代码(日志/事务/安全的代码)都写在一个抽象类中,然后抽象类搞一个口子,让子类去实现这个口子,这样就相当于子类接上了这些非业务代码。但是这个思路也有问题,问题就是父类(抽象类)会定义一切,子类一旦接入了这个口子就相当于被动接受所有的方法。

所以我们就引入了 Spring AOP 面向切面编程这种思想。比如说我们把事务代码写成一个事务类。然后用 XML 描述一下事务类应该要怎么插进业务代码中(比如这个事务类的 begin() 方法切入到业务代码的哪里.....)。这样子代码直接灵活了。这就是 Spring 的面向切面思想。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值