目录
1、如果没有IOC,我们的项目维护有什么问题
2、IOC解决了什么问题
3. 如果没有AOP,我们的项目维护有什么问题
4. AOP解决了什么问题
今天咱们来用大白话聊聊spring的IOC和AOP。
平常我们写代码,如果一个类ServiceA要调用另一个类ServiceB的某个方法,就需要在类ServiceA的方法里new一个类ServiceB的对象。
假如现在你有几十个类都需要用到ServiceB的某个方法,那你就需要在几十个类里,都分别去new一个ServiceB的对象。
有一天,业务改了,你写了一个新的类ServiceC,类ServiceB就废弃不用了。那之前调用ServiceB的几十个类,你就得把几十个类中
“ServiceB b= new ServiceB ()”
“ServiceC c= new ServiceC ()”
了。那如果有一天,ServiceC也废弃了,现在几十个类又需要去调用ServiceD的方法了,你怎么办?还有,万一你没有替换完整怎么办,比如你漏掉了一处,那项目跑的时候又去调用对象ServiceC 的方法,但此时ServiceC 的逻辑已经废弃了,是不是还有可能造成线上问题,产生脏数据啥的?
基于这种类和类完全耦合在一起的情况,spring的IOC机制就应运而生了。
假如现在你的项目引入了spring框架,那你现在还是有一样的需求,就是ServiceA里还是得调用ServiceB的某个方法,此时你的代码就变成这样了。
你创建一个接口ServiceB,然后给它创建一个实现类ServiceBImpl。在ServiceA里注入接口ServiceB。
这个时候,当你的项目启动的时候,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()”了。
很久以前,我大学的时候,老师教的JSP+Servlet项目,每次要做增删改查的时候,一个方法里都得在开头写“开启事务”等等固定代码,结尾的地方都得写“提交事务”等固定代码。
再举个例子,公司现在让你做一个日志模块,就是把所有增删改的操作都记录到一张表中。你一看需求,嗨简单,为了快点实现功能,你在每个增删改的方法后面都写了一堆固定的代码,调用方法A得到当前用户,然后调用Dao A把数据写到日志表里。
然后你写完项目上线了。过了几天,方法A和Dao A废弃了,你得调用方法B和Dao B了!那你怎么办?只能去一个个方法里改代码了!但是万一你漏改一处怎么办,上线后肯定会有问题啊!
4. AOP解决了什么问题
现在我们用Spring框架写代码,遇到增删改,会直接在方法的上面加个事务注解@Transcational,然后直接写我们自己的业务逻辑就行。实际上,在底层,Spring容器它可是使用动态代理技术,给我们方法上加了@Transcational注解的类,去生成了一个动态代理类的。
这个动态代理类
实现了你的类的
所有方法。
这个代理类会给每个实现的方法中织入一些增强代码。比如类A中的方法A上面加了事务注解@Transcational,那动态代理生成的代理类ProxyA的方法A,就会在方法开头织入“开启事务”等等的固定代码,在结尾处织入“提交事务”的固定代码。
这么一来,就可以避免最开始 JSP + Servlet项目那种重复的“开启事务”、“提交事务”的代码块了。
用AOP做项目的日志记录也是一样的原理,
AOP,就是通过动态代理技术生成类的一个动态代理类,这个动态代理类实现了你的类的所有方法
,
然后根据你
的注解,
给每个方法织入一些增强代码。
从而避免了
项目
中大
量重复代码
,
一改就得
改几十个方法的问题了
。
End
作者简介:豪横的小耳朵,一个豪横的程序员。想和大家一起在技术的世界里豪横,用技术的眼光去看待世界。欢迎扫描下方二维码,持续关注,一大波原创系列文章正在路上