目录
一、若是没有IOC,咱们的项目维护有什么问题
二、IOC解决了什么问题
3. 若是没有AOP,咱们的项目维护有什么问题
4. AOP解决了什么问题
复制代码
你们好,我是四九城最豪横的小耳朵。java
今天我们来用大白话聊聊spring的IOC和AOP。程序员
一、若是没有IOC,咱们的项目维护可能有哪些问题spring
日常咱们写代码,若是一个类ServiceA要调用另外一个类ServiceB的某个方法,就须要在类ServiceA的方法里new一个类ServiceB的对象。框架
假如如今你有几十个类都须要用到ServiceB的某个方法,那你就须要在几十个类里,都分别去new一个ServiceB的对象。spa
有一天,业务改了,你写了一个新的类ServiceC,类ServiceB就废弃不用了。那以前调用ServiceB的几十个类,你就得把几十个类中 “ServiceB b= new ServiceB ()” 的代码改为 “ServiceC c= new ServiceC ()” 了。那若是有一天,ServiceC也废弃了,如今几十个类又须要去调用ServiceD的方法了,你怎么办?还有,万一你没有替换完整怎么办,好比你漏掉了一处,那项目跑的时候又去调用对象ServiceC 的方法,但此时ServiceC 的逻辑已经废弃了,是否是还有可能形成线上问题,产生脏数据啥的?3d
二、IOC解决了什么问题代理
基于这种类和类彻底耦合在一块儿的状况,spring的IOC机制就应运而生了。日志
假如如今你的项目引入了spring框架,那你如今仍是有同样的需求,就是ServiceA里仍是得调用ServiceB的某个方法,此时你的代码就变成这样了。code
你建立一个接口ServiceB,而后给它建立一个实现类ServiceBImpl。在ServiceA里注入接口ServiceB。cdn
这个时候,当你的项目启动的时候,Spring 容器在底层使用java的反射技术,去扫描项目中的Bean。
它首先发现类 ServiceA 里引用了接口ServiceB,而后它去找如今是谁实现了接口ServiceB,它发现原来是类ServiceBImpl实现了接口ServiceB,此时根据这层依赖关系,它就会在类 ServiceA实例化一个ServiceBImpl的对象。
这样作的好处是什么呢?若是我如今类ServiceBImpl又废弃了,类ServiceA须要去调用我新写的ServiceC 的方法了,那我类A里面的代码“@Autowired private ServiceB b”还须要改吗?根本不须要啊,我只须要让新写的ServiceC 去实现接口ServiceB 不就好了吗,这样一来Spring容器不就在类A的内部生成ServiceC 对象了吗?
这样一来,假如几十个类都引用了接口ServiceB,我也只须要让ServiceC 实现接口ServiceB 而已,根本不用改几十个类中的相关引用代码块了。
也就是说,IOC,也称依赖注入,就是Spring容器用反射技术,根据注解或配置文件去建立Bean, 而后根据Bean之间的依赖和引入关系,去实例化对应的对象,实现了类和类之间完全的解耦。你建立个接口,而后有个实现类A,别的类引用了A里的逻辑,后边A废弃了,你就能够建立个类B,让它实现接口,只须要作这么一步而已,不像以前那样,你还得把每一个类中“A a = new A()”的代码都改为“B b = new B()”了。
说完IOC,再来讲说AOP。
好久之前,我大学的时候,老师教的JSP+Servlet项目,每次要作增删改查的时候,一个方法里都得在开头写“开启事务”等等固定代码,结尾的地方都得写“提交事务”等固定代码。
天哪,你想一想,这么多重复的代码,毫无美感可言。
再举个例子,公司如今让你作一个日志模块,就是把全部增删改的操做都记录到一张表中。你一看需求,嗨简单,为了快点实现功能,你在每一个增删改的方法后面都写了一堆固定的代码,调用方法A获得当前用户,而后调用Dao A把数据写到日志表里。
而后你写完项目上线了。过了几天,方法A和Dao A废弃了,你得调用方法B和Dao B了!那你怎么办?只能去一个个方法里改代码了!可是万一你漏改一处怎么办,上线后确定会有问题啊!
基于上面重复代码的问题,AOP就应运而生了。
如今咱们用Spring框架写代码,遇到增删改,会直接在方法的上面加个事务注解@Transcational,而后直接写咱们本身的业务逻辑就行。实际上,在底层,Spring容器它但是使用动态代理技术,给咱们方法上加了@Transcational注解的类,去生成了一个动态代理类的。这个动态代理类实现了你的类的全部方法。
这个代理类会给每一个实现的方法中织入一些加强代码。好比类A中的方法A上面加了事务注解@Transcational,那动态代理生成的代理类ProxyA的方法A,就会在方法开头织入“开启事务”等等的固定代码,在结尾处织入“提交事务”的固定代码。
这么一来,就能够避免最开始 JSP + Servlet项目那种重复的“开启事务”、“提交事务”的代码块了。
用AOP作项目的日志记录也是同样的原理,AOP,就是经过动态代理技术生成类的一个动态代理类,这个动态代理类实现了你的类的全部方法,而后根据你的注解,给每一个方法织入一些加强代码。从而避免了项目中大量重复代码,一改就得改几十个方法的问题了。
End
复制代码
做者简介:豪横的小耳朵,一个豪横的程序员。想和你们一块儿在技术的世界里豪横,用技术的眼光去看待世界。欢迎扫描下方二维码,持续关注,一大波原创系列文章正在路上