大白话聊聊spring的IOC和AOP

目录

1、如果没有IOC,我们的项目维护有什么问题
2、IOC解决了什么问题
3. 如果没有AOP,我们的项目维护有什么问题
4. AOP解决了什么问题

大家好,我是四九城最豪横的小耳朵。

大白话聊聊spring的IOC和AOP

今天咱们来用大白话聊聊spring的IOC和AOP。

1、如果没有IOC,我们的项目维护可能有哪些问题

平常我们写代码,如果一个类ServiceA要调用另一个类ServiceB的某个方法,就需要在类ServiceA的方法里new一个类ServiceB的对象。

大白话聊聊spring的IOC和AOP

假如现在你有几十个类都需要用到ServiceB的某个方法,那你就需要在几十个类里,都分别去new一个ServiceB的对象。
大白话聊聊spring的IOC和AOP

有一天,业务改了,你写了一个新的类ServiceC,类ServiceB就废弃不用了。那之前调用ServiceB的几十个类,你就得把几十个类中
“ServiceB b= new ServiceB ()”
的代码改成
“ServiceC c= new ServiceC ()”
了。那如果有一天,ServiceC也废弃了,现在几十个类又需要去调用ServiceD的方法了,你怎么办?还有,万一你没有替换完整怎么办,比如你漏掉了一处,那项目跑的时候又去调用对象ServiceC 的方法,但此时ServiceC 的逻辑已经废弃了,是不是还有可能造成线上问题,产生脏数据啥的?

2、IOC解决了什么问题

基于这种类和类完全耦合在一起的情况,spring的IOC机制就应运而生了。

假如现在你的项目引入了spring框架,那你现在还是有一样的需求,就是ServiceA里还是得调用ServiceB的某个方法,此时你的代码就变成这样了。

大白话聊聊spring的IOC和AOP

你创建一个接口ServiceB,然后给它创建一个实现类ServiceBImpl。在ServiceA里注入接口ServiceB。

这个时候,当你的项目启动的时候,Spring 容器在底层使用java的反射技术,去扫描项目中的Bean。

它首先发现类 ServiceA 里引用了接口ServiceB,然后它去找现在是谁实现了接口ServiceB,它发现原来是类ServiceBImpl实现了接口ServiceB,此时根据这层依赖关系,它就会在类 ServiceA实例化一个ServiceBImpl的对象。

大白话聊聊spring的IOC和AOP

这样做的好处是什么呢?如果我现在类ServiceBImpl又废弃了,类ServiceA需要去调用我新写的ServiceC 的方法了,那我类A里面的代码“@Autowired private ServiceB b”还需要改吗?根本不需要啊,我只需要让新写的ServiceC 去实现接口ServiceB 不就行了吗,这样一来Spring容器不就在类A的内部生成ServiceC 对象了吗?

大白话聊聊spring的IOC和AOP

这样一来,假如几十个类都引用了接口ServiceB,我也只需要让ServiceC 实现接口ServiceB 而已,根本不用改几十个类中的相关引用代码块了。

也就是说,IOC,也称依赖注入,就是Spring容器用反射技术,根据注解或配置文件去创建Bean, 然后根据Bean之间的依赖和引入关系,去实例化对应的对象,实现了类和类之间彻底的解耦。你创建个接口,然后有个实现类A,别的类引用了A里的逻辑,后边A废弃了,你就可以创建个类B,让它实现接口,只需要做这么一步而已,不像之前那样,你还得把每个类中“A a = new A()”的代码都改成“B b = new B()”了。

  1. 如果没有AOP,我们的项目维护有什么问题

说完IOC,再来说说AOP。

很久以前,我大学的时候,老师教的JSP+Servlet项目,每次要做增删改查的时候,一个方法里都得在开头写“开启事务”等等固定代码,结尾的地方都得写“提交事务”等固定代码。

大白话聊聊spring的IOC和AOP

天哪,你想想,这么多重复的代码,毫无美感可言。

再举个例子,公司现在让你做一个日志模块,就是把所有增删改的操作都记录到一张表中。你一看需求,嗨简单,为了快点实现功能,你在每个增删改的方法后面都写了一堆固定的代码,调用方法A得到当前用户,然后调用Dao A把数据写到日志表里。

大白话聊聊spring的IOC和AOP

然后你写完项目上线了。过了几天,方法A和Dao A废弃了,你得调用方法B和Dao B了!那你怎么办?只能去一个个方法里改代码了!但是万一你漏改一处怎么办,上线后肯定会有问题啊!

  1. AOP解决了什么问题

基于上面重复代码的问题,AOP就应运而生了。

现在我们用Spring框架写代码,遇到增删改,会直接在方法的上面加个事务注解@Transcational,然后直接写我们自己的业务逻辑就行。实际上,在底层,Spring容器它可是使用动态代理技术,给我们方法上加了@Transcational注解的类,去生成了一个动态代理类的。这个动态代理类实现了你的类的所有方法。

大白话聊聊spring的IOC和AOP

这个代理类会给每个实现的方法中织入一些增强代码。比如类A中的方法A上面加了事务注解@Transcational,那动态代理生成的代理类ProxyA的方法A,就会在方法开头织入“开启事务”等等的固定代码,在结尾处织入“提交事务”的固定代码。

大白话聊聊spring的IOC和AOP

这么一来,就可以避免最开始 JSP + Servlet项目那种重复的“开启事务”、“提交事务”的代码块了。

用AOP做项目的日志记录也是一样的原理,AOP,就是通过动态代理技术生成类的一个动态代理类,这个动态代理类实现了你的类的所有方法,然后根据你的注解,给每个方法织入一些增强代码。从而避免了项目中大量重复代码,一改就得改几十个方法的问题了。

End

作者简介:豪横的小耳朵,一个豪横的程序员。想和大家一起在技术的世界里豪横,用技术的眼光去看待世界。欢迎扫描下方二维码,持续关注,一大波原创系列文章正在路上

大白话聊聊spring的IOC和AOP