vlambda博客
学习文章列表

大白话聊聊spring的IOC和AOP



目录

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

2、IOC解决了什么问题

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

4.  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()”了。


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

说完IOC,再来说说AOP。

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

大白话聊聊spring的IOC和AOP


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

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

大白话聊聊spring的IOC和AOP



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


4.  AOP解决了什么问题


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

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

大白话聊聊spring的IOC和AOP


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



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

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


End


 


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