测试同学上手Spring 之IoC深入解析

想要理解Spring,必须要掌握的两个知识点就是IoC和AOP,在这里我首先带大家了解一下什么是IoC。为大家上手Sping编码做好前期最充分的知识储备,做到有的放矢!

Spring Hello World 回顾

在Hello Spring实例中我们定义了类

public class HelloSpring {

    private String name="hello";

    HelloSpring(){

     System.out.println("Hello Spring");

    } 

    public String getName() {

        return this.name ;

    }    

    public void setName(String name) {

        this.name = name;

    }

}

配置文件中的配置信息如下:

<beanid="hellospring"class="com.my.demo.HelloSpring"/>

调用HelloSpring中的getName方法代码如下:

public static void main(String[] args) {

ApplicationContextcontext = new ClassPathXmlApplicationContext("beans1.xml");

HelloSpringhello = (HelloSpring) context.getBean("hellospring");

           System.out.println(hello.getName());

        }

}

运行结果如下:

Hello Spring //构造函数中输出的值

Hello //getName方法中输出的值

详细可以参考文章测试同学从0到1上手Spring

IOC解读

我们可以看到spring并没有new 实例的过程,但是完成了实例化的操作,并成功地调用了getName方法。这就是Spring中的控制反转技术(IoC)。

Spring通过一种称作控制反转(Inversion of Control —IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。也就是说Spring控制了对象的生成,应用程序不再需要主动创建对象了!

我们通常说的SpringIoC,实际上是指Spring框架提供的IoC容器实现(IoC Container)。

Spring 的 IoC 容器中发生的事情其实也很简单,总结下来即两个阶段:

采摘和收集“咖啡豆”(bean)

研磨和烹饪咖啡

第一个阶段可以认为是构建和收集 bean 定义的阶段,在这个阶段中,我们可以通过 XML 或者 Java 代码的方式定义一些 bean,然后通过手动组装或者让容器基于某些机制自动扫描的形式,将这些 bean 定义收集到 IoC 容器中。我们通常通过在xml文件中定义bean,然后容器再将这些bean收集到IoC容器中。当第一阶段工作完成后,我们可以先暂且认为 IoC 容器中充斥着一个个独立的 bean,它们之间没有任何关系。但实际上,它们之间是有依赖关系的,所以,IoC容器在第二阶段要干的事情就是分析这些器已经在 IoC 容器之中的 bean,然后根据它们之间的依赖关系先后组装它们。如果 IoC 容发现某个 bean 依赖另一个 bean,它就会将这另一个 bean 注入给依赖它的那个 bean,直到所有 bean 的依赖都注入完成,所有 bean 都“整装待发”,整个 IoC 容器的工作即算完成。

IOC基本运行流程如下图所示:

Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean之间的依赖关系,为上层应用提供准备就绪的运行环境。

IOC深入理解

IoC容器

实现了IoC思想的容器就是IoC容器。IoC容器功能包括:实例化、初始化组件、装配组件依赖关系、负责组件生命周期管理。

IoC容器特点

无需主动new对象;而是描述对象应该如何被创建即可。IoC容器帮你创建,即被动实例化;

不需要主动装配对象之间的依赖关系,而是描述需要哪个服务(组件),IoC容器会帮你装配(即负责将它们关联在一起),被动接受装配;

IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则。

理解IoC容器问题关键:控制的哪些方面被反转了?

1、谁控制谁?为什么叫反转? IoC容器控制,而以前是应用程序控制,所以叫反转

2、控制什么?控制应用程序所需要的资源(对象、文件……)

3、为什么控制?解耦组件之间的关系

4、控制的哪些方面被反转了?程序的控制权发生了反转:从应用程序转移到了IoC容器。

使用IoC容器开发需要改变的思路

1、应用程序不主动创建对象,但要描述创建它们的方式。

2、在应用程序代码中不直接进行服务的装配,但要配置文件中描述哪一个组件需要哪一项服务。容器负责将这些装配在一起。

最通俗的解释

所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容