Spring的IOC(依赖注入和控制反转)

Spring框架面试笔试必问之一!非常重要也非常强大,说实话一开始仿照着Spring MVC配置搭建起来,再写几句增删改查,真的配不上叫做学会了那个框架。框架是N种优秀的设计模式和一些很高深的技术组合在一起的完美的精致的产物!

百度镇楼!

在这里插入图片描述

谁在刚毕业的时候,都会去背IOC的概念,背来背去,还是稀里糊涂,就算背的滚瓜烂熟了,要画流程图实现又是考死一大片。所以,我这篇博客,意在帮助所有学习Spring框架的人,深刻而且清晰地了解IOC!
说实话,我写Spring写得也不少了,真正仔细去弄明白它的时候,确实也是被震撼到了,跪着看完那些天才大佬的设计,感觉自己只是个充数的码农而已。
废话不多说,在看这篇文章之前,必须有单例模式和工厂模式和反射机制创建对象的基础,要懂得什么叫做全限定名和容器类的概念,还要懂得类加载过程。这些在我其他博客都有讲解,必须有这些基础,才能真正感受到IOC的魅力。

呼~舒缓一下心情。前方高能。

IOC(Inversion of Control)即控制反转,网上一抓一大把的概念就是将对象的管理交给Spring容器,再靠注入的方式来使用容器中给我们实例化好的对象。

是的它的确做了这种事,下面是具体实现:

Bean在英语是豌豆荚,计算机语言中是可重用组件。

BeanFactory就是我们说的工厂模式,它通常都是static的,在加载的时候就执行,这个工厂是做什么呢?就是给我们生产对象,我们都知道用类来创建对象就是 A a = new A();就完事了,但是在这里我们设想一下,有一百个地方需要用到a,那就new 100次?这里当然可以用单例模式,但是有一次你用不上了,删掉了这个A类,那么你就要修改一百个地方?要不然编译一片红彤彤。那我们还不如指定从一个地方拿,就算那个类不存在了,我们也不会在编译期报错,更不会要重复删除100个地方的代码。那我们要拿,首先就要生产出来才能给我们拿,那个地方,就是BeanFactory.

BeanFactory工厂能生产对象的秘密:

BeanFactory底层,就是通过一个Properties对象来读取指定路径下的配置文件,配置文件写的什么呢?就可以是用key - value 形式写的 类名 和 全限定名。
那Properties对象循环读取了整个配置文件,获取了全部类名和全部类的全限定名,那又能怎么样呢?全限定名!已经足够让我们创建对象!所以!我们在循环中!不断使用反射机制通过全限定名创建一个又一个的对象!同时还会定义一个Map,把类名做Key,创建出来的对象的引用地址做Value,一层层循环存入Map。
这个Map。就已经有全部的类名和对应的实例化对象的引用!从此它叫容器。再定一个getBean(XXX)方法,XXX就是你要用的类名(当然也不局限于类名)。然后?Map中的 K - V 结构,根据key找value的方法,直接返回对象的引用!
当我们再需要用到对象A a , 根本不需要自己拿类,直接调用一个BeanFactory中的getBean(XXX)方法,传入A,也就是getBean(A);就可以了。顺利拿到实例化好的对象,那就调用方法或者属性还不是轻而易举的事情。

以上就是它的具体底层实现,在Spring中,我们在XML配置文件配置的那些,仔细想想是不是有一个id,有一个class?那个class,长得像不像全限定名?所以!Spring的XML配置文件,就是要求我们按照它的约束和写法,写出自己要用到的类和提供给它加载生产的全限定名,生产出来后存入容器中,然后我们就随时随地可以拿出来用!

@component注解就是把修饰的类通过工厂的反射创建一个对象,并将创建出来的单例对象存放入容器中。
@Service,@Controller,@Respository这几个注解都是同样用法,只不过我们知道Spring分MVC,不同逻辑层面的类最好用指定的注解加入工厂。
@Controller 就是控制器层的Class 创建对象加入容器的注解。
@Service 就是服务层的,这里一般写一大堆的业务逻辑,实现增删改查和复杂运算的类。
@Respository是持久层的,负责与数据库交互的类。

那假如,我有一百个类,那就在XML配置中写100个?开什么玩笑这不是更麻烦了吗?于是我们只需要在需要被注入到容器中的类上面轻轻加一个@Component注解,然后再去XML或者注解配置中指定一下扫描的包的文件目录:<context: component-san base-package(“XXXXXXXXX”)></context: component-san>这样Spring就帮我们自动识别出你要注入的类,它就自动加入工厂,自动帮你创建对象并且管理对象的生命周期,在你要用的时候,你就直接注入使用。

@Autowired

A a ;

@Autowired就是注入的接口,它会根据类型A去容器中找到指定的对象返回,并注入到变量 a 里面。完全按照类型匹配,跟key id 半毛钱关系都没有。

是不是很神奇?IOC其实只是帮你管理,你要使用的话,还有一个叫做依赖注入(DI),仔细想想要从自己写的工厂类中拿到一个对象,是不是有个getBean(XXX )方法?其实这一步去容器中找对象的步骤,Spring就是通过@Autowired注解实现了。

绕了一大圈,原来是这么回事。现在开始抠字眼解释。

控制,原来就是控制对象的生命周期,从创建,使用,销毁一条龙服务。
反转,原来就是把我们主动不同地new,翻身做主人,反转成为声明+注入就可以直接调用。
依赖,原来就是一个类依赖着另外一个类,另外一个类不活了,这个类也活不下去,方法调用疯狂报错。
注入,就是把他所需要的类,通过注解的方式或者配置的方式注入进去,注入用的英文是injection,注射,也就是代表很微小的代码改动,很小的创口。

依赖注入,就是组件与组件之间相互依赖的关系,都能由XML配置中的或者由一个注解来解决依赖关系,不再需要一层层去实例化。同时在一个A类中,调用另外一个B类的方法,也可以说A类依赖B类,依赖关系一确立,就难免有耦合,所以解耦就是依赖注入。
控制反转,原来就是从一开始的我们主动去new对象才能使用对象,变成了我们只要加两个注解@Component和@Autowired,Spring就自己帮我们创建好并送到我们跟前给我们使用。而且还不用我们去担心对象单例模式的实现(不然我们有100个类,其中80个都要求单例模式,那我们光写重复代码都写疯了)又不用我们去管理对象的生命周期,那我们真的是一股脑写业务代码就行了。

以上就是我自己的总结!鞠躬!

猜你喜欢

转载自blog.csdn.net/whiteBearClimb/article/details/104253370