一 、 什么是IOC(Inversion of Control)

IOC :控制反转,也称为依赖注入(DI)。听起来有点云里雾里,他到底是个啥,为什么Spirng中最基础的就是它?

我们的项目其实都是有一个一个的Bean组成的(通俗的说就是一个一个的java类),我们如果要使用一个Bean,那么就得在使用的地方new一个对应的实例出来,这样一来我的这个Bean是不是就依赖了另外一个Bean,而且对于某一个Bean,有可能其他很多地方会用到?是不是?那么,当我的这个Bean要换一种实现,那么我是不是要将代码中其所有的地方都得改一下,这种强耦合,显然不是我们所期望的。而且,一个Bean绝大多数时候做的事情都是一样的,如果到处new,那我们内存中的Bean就爆炸式的增长,显然也不是我们所期望的。

  那么,我们有没有一个东西,像tomcat容器一样,将我们的Bean放到里面,而且每个Bean不特殊声明的话,就只有一份,我要用的时候(程序运行的时候,写代码的时候我只要声明),让容器把这个Bean给我就是了。这个就是Spring给我们干的事:作为一个容器,将Bean装起来,管理起来。(这里面就用到了集合,这也是为什么在TinkingInJava这本书中,把我们的集合称作容器了,我觉得叫容器更合适)

这样一来,我们看看,平时都是我们要用一个Bean的时候去再使用的地方主动new一个,这种对应用的控制是由引用者自己来决定的。现在,这种应用的控制由Bean容器担当,使用者不要直接去new一个Bean,你只要告诉我你要什么Bean,我容器已经给你new好了,你要用的时候我给你就是了(通常是创建这个调用者示例的时候将被调用的Bean给他,亦或叫将这个依赖注入给它)。至于具体用哪一个,这就由容器统一管理了。这就是所谓的“控制反转”--使用者只声明不控制(不new一个具体的bean),由一个统一的控制中心(Bean容器)去控制。

这就是控制反转,是不是很简单。而且听到这里,我们大家都会浮出“工厂方法”这个词,对没错,Spring就是通过工厂方法实现的控制反转。接下来,我们来简单介绍一下Spring中IOC的实现。

二、Spring-IOC简单介绍

IOC 基础包

|- org.springframework.beans : Spring中Bean操作的核心也是基础包,其中BeanFactory接口是Spring中访问Bean的跟接口,它提供了一种高级配置机制,能够管理任何类型的对象。

|- org.springframework.context : Spring中上下文相关包,其中ApplicationContext接口继承自BeanFactory接口。

|- org.springframework.core : Spring和核心工具类,几乎spirng中所有的组件都要依赖它

   其中,org.springframework.context.ApplicationContext接口表示Spring IoC容器,并负责实例化、配置和组装bean。容器通过读取配置元数据获取关于实例化、配置和组装哪些对象的说明。配置元数据用XML、Java注释或Java代码表示。它允许您表达组成应用程序的对象以及这些对象之间丰富的相互依赖关系。

  Spring提供了ApplicationContext接口的几个实现。在独立应用程序中,通常创建ClassPathXmlApplicationContext或FileSystemXmlApplicationContext的实例。

  虽然XML一直是定义配置元数据的传统格式,但是您可以指示容器使用Java注释或代码作为元数据格式。现在绝大多数都是用的Java注释,SpringBoot引入之后,更是如此,不过我们传统的Spring项目几乎都是xml配置文件,所以我们也首先从xml配置文件管理Bean的方式说起。毕竟,我们就是为了解耦,将硬编码写到配置文件中去。

ok,我们闲话少说,先看一个示例吧。

  首先,我们引入依赖:

  1. <!-- 官方建议用spring-boot来开启spring的学习,我们引入这个,主要是为了统一管理版本 -->
  2. <parent>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-parent</artifactId>
  5. <version>2.1.2.RELEASE</version>
  6. </parent>
  7.  
  8. <dependencies>
  9. <dependency>
  10. <groupId>org.springframework</groupId>
  11. <artifactId>spring-context</artifactId>
  12. </dependency>
  13. <!-- ps:
  14. 这就是maven方便的地方,spring-context中已经把core、beans都引入进来了
  15. -->
  16. </dependencies>

  引入该依赖之后,基本的依赖包均已引入,如图所示:

  接下来,我们就可以开始写一个简单的测试用例了:

新建一个pojo(普通javaBean)

  1. public class MyTestBean {
  2. private String testString = "testBean";
  3.  
  4. public String getTestString() {
  5. return testString;
  6. }
  7.  
  8. public void setTestString(String testString) {
  9. this.testString = testString;
  10. }
  11. }

然后,编写beanFactoryTest.xml配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <!-- 可以查看官网,将官网中的示例下载下来,然后根据实际需要更改 -->
  7.  
  8. <bean id="myTestBean"
  9. class="top.djlee.spring.ioc.pojo.MyTestBean">
  10.  
  11. </bean>
  12. <!-- ps:
  13. id属性是标识单个bean定义的字符串。
  14. class属性定义bean的类型并使用完全限定的类名。
  15.  
  16. 当然,Bean的定义不仅仅如此,不过基本上这两个定义就足够我们的应用了。
  17. -->
  18. </beans>

  最后,我们来写一个主类,去测试一下是否能够注入:

  1. public class FirstIocDemo {
  2. public static void main(String[] args) {
  3. @SuppressWarnings("resource")
  4. ApplicationContext context = new ClassPathXmlApplicationContext("beanFactoryTest.xml");
  5. MyTestBean myTestBean = context.getBean("myTestBean",MyTestBean.class);
  6. System.out.println(myTestBean);
  7. }
  8. }
  9.  
  10. //输入内容:MyTestBean [testString=testBean]

至此,我们一个简单的SpringIOC就实现了。

通过这个示例,我们看到了,Spirng帮我们做了如下的事:

读取配置文件->根据beanFactoryTest.xml文件中的配置找到对应的类,并实例化,放到context中去->从context中拿到这个类并调用之.

当然,SpringIOC当然不仅仅如此,我们只是为了演示方便,将最简单的应用提出来,在接下来的文章中,我们就会就这这个简单的应用去尝试着分析Spring-IOC的原理,与大家一起走进Spirng-IOC的世界。

  

一、 Spring IOC 简介的更多相关文章

  1. Spring - IOC简介

    DI(Dependence Injection)依赖注入: userService依赖于容器注入的 这样拿的 这个过程由容器来控制,这个称为依赖注入. IOC(Inverse of control)控 ...

  2. Spring IoC简介及使用

    Spring根本任务 Spring的根本任务就是简化Java开发. 目前许多框架如果要使用他们,就必须要继承或实现这些框架的各种类.这使得框架与我们的程序耦合度过高.由于在我们的程序中加入了过多的框架 ...

  3. 框架:Spring IoC

    Spring篇 第二章.Spring IoC简介 一.基本概念 控制反转是一个比较抽象的概念,是Spring框架的核心,用来消减计算机程序的耦合问题. 依赖注入是IoC的另外一种说法,只是从不同的角度 ...

  4. Unit01: Spring简介 、 Spring容器 、 Spring IOC

    Unit01: Spring简介 . Spring容器 . Spring IOC Spring (1)Spring是什么? Spring是一个开源的用来简化应用开发的框架. (2)Spring的特点? ...

  5. Spring简介即Spring Ioc

    Spring框架简介 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE De ...

  6. Spring4- 01 - Spring框架简介及官方压缩包目录介绍- Spring IoC 的概念 - Spring hello world环境搭建

    一. Spring 框架简介及官方压缩包目录介绍 主要发明者:Rod Johnson 轮子理论推崇者: 2.1 轮子理论:不用重复发明轮子. 2.2 IT 行业:直接使用写好的代码. Spring 框 ...

  7. Spring IoC 和 DI 简介(二)

    Spring IoC 和 DI 简介 IoC:Inverse of Control(控制反转) 读作“反转控制”,更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由 ...

  8. [spring源码学习]一、IOC简介

    一.程序实例 假设一个简单地实例,我们有一个人,人可能有姓名,年龄等属性,每天上下班的时候需要坐车,他可能做小轿车,suv等,这样一个场景.我们很容易想到如下代码: 1.人的对象类,包括两个属性,姓名 ...

  9. Spring IOC 容器 简介

    Spring 容器是 Spring 框架的核心.容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁. Spring 容器使用依赖注入(DI)来管理组成一个应用程序的组件. ...

随机推荐

  1. 常见的CSS和HTML面试题

    1. 常用那几种浏览器测试?有哪些内核(Layout Engine)? 浏览器:IE,Chrome,FireFox,Safari,Opera. 内核:Trident,Gecko,Presto,Webk ...

  2. day02 秘钥生成,免密访问命令

    hadoop免密登陆: 生成秘钥: ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa cat ~/.ssh/id_dsa.pub >> ~/.ssh/aut ...

  3. CentOS 7 安装 Zabbix 3.0

    CentOS7搭建Zabbix 一.安装数据库: 1.  安装数据库:sudo  yum  grouinstall mariadb –y 2.  启动数据库:sudo systemctl  start ...

  4. [hdu4372]counting buildings

    解题关键: n的环排列的个数与n-1个元素的排列的个数相等. 首先可以肯定,无论从最左边还是从最右边看,最高的那个楼一定是可以看到的,从这里入手. 假设最高的楼的位置固定,最高楼的编号为n,那么我们为 ...

  5. oracle中文乱码解决方法笔记

    我刚刚在linux下安装oracle时就碰到这个问题,查了半天知道问题是oracle的字符集不对. 解决方法是dbca进入图形界面,删去现有的库,重建新库. 建库时注意: 1,dbca创建, 选第一项 ...

  6. URAL 1297 Palindrome (后缀数组+RMQ)

    题意:给定一个字符串,求一个最长的回回文子串,多解输出第一个. 析:把字符串翻转然后放到后面去,中间用另一个字符隔开,然后枚举每一个回文串的的位置,对第 i 个位置,那么对应着第二个串的最长公共前缀, ...

  7. Elasticsearch集群使用ik分词器

    IK分词插件的安装 ES集群环境 VMWare下三台虚拟机Ubuntu 14.04.2 LTS JDK 1.8.0_66 Elasticsearch 2.3.1 elasticsearch-jdbc- ...

  8. 关于奇异值分解(SVD)的理解

    奇异值分解实际上是将一个矩阵,分解成为两个不同维度(行数和列数)上的正交向量集之间的映射变换,奇异值则是变换时的缩放! 例如上面的矩阵M就是一个5维映射到4维的变换矩阵,而SVD分解得到的奇异值和奇异 ...

  9. 【Qt文档阅读】事件系统

    在Qt中,事件对象都继承于QEvent类,它表示应用程序内部或由于应用程序需要了解的外部活动而发生的事情.事件可以由QObject子类的任何实例接收和处理,尤其是widget.本文档描述如何在典型应用 ...

  10. 【转】vs发布msi程序详解

    源地址:http://wenku.baidu.com/link?url=MV1Mf7IukCZ0cab8AzXQoQ3MAXeUAHGz5b2IuUL4Kw-hCI90ZyBKXwKeQA3t3-SV ...