一 、 什么是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,我们闲话少说,先看一个示例吧。

  首先,我们引入依赖:

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

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

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

新建一个pojo(普通javaBean)

public class MyTestBean {
private String testString = "testBean"; public String getTestString() {
return testString;
} public void setTestString(String testString) {
this.testString = testString;
}
}

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

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

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

public class FirstIocDemo {
public static void main(String[] args) {
@SuppressWarnings("resource")
ApplicationContext context = new ClassPathXmlApplicationContext("beanFactoryTest.xml");
MyTestBean myTestBean = context.getBean("myTestBean",MyTestBean.class);
System.out.println(myTestBean);
}
} //输入内容: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. HDFS追加文件

    配置:hdfs-site.xml <property> <name>dfs.support.append</name> <value>true</ ...

  2. Java学习之多态(Polymorphism)

    多态==晚绑定 不要把函数重载理解为多态. 因为多态是一种运行期的行为,不是编译期的行为. 多态:父类型的引用可以指向子类型的对象. 比如 Parent p = new Child(); 当使用多态方 ...

  3. idea使用的知识

    1. 如何设置,使IntelliJ IDEA智能提示忽略大小写.    很好用,在settings->Editor->General-->Code Completion里设置.2. ...

  4. cargo实现自动化部署远程jetty容器(非安全模式)

    cargo实现自动化部署应用至远程jetty容器 (非安全模式) 一.准备: WAR包:Deployer Web application for the Jetty remote containers ...

  5. Vue.js 源码实现

    目录 Vue.js 代码实现 1. 步骤一 2. 步骤二 3.步骤三 Vue.js 工作机制 初始化 编译 响应式 虚拟dom 更新视图 编译 Vue.js 代码实现 检验学习效果的最好方法就是自己造 ...

  6. java解析xml实例——获取天气信息

    获取xml并解析其中的数据: package getweather.xml; import java.io.IOException; import java.util.HashMap; import ...

  7. Java 异常处理基本规则,Java异常处理的基本规范

    看了团队中原来代码中的异常处理,心碎了一地,稍微对照阿里巴巴的异常处理规范整理了一遍,准备分享一下,Java的异常处理规范&约束. 一.运行异常的扑捉 不要捕获 Java 类库中定义的继承自  ...

  8. 乐字节Java8核心特性之Optional类

    大家好啊,上次小乐给大家介绍了Java8最最重要的一个特性——Stream流,点击可以回顾哦. Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在 ...

  9. 快速搭建angular7 前端开发环境

    第一步:全局安装 Angular CLI (1)打开npm(终端)安装angular-cli 第二步:创造工作区和初始应用 (1)运行命令 ng new my-app 第三步:启动开发服务器 (1)c ...

  10. linux中使用wget模拟爬虫抓取网页

    如何在linux上或者是mac上简单使用爬虫或者是网页下载工具呢,常规的我们肯定是要去下载一个软件下来使用啦,可怜的这两个系统总是找不到相应的工具,这时wget出来帮助你啦!!!wget本身是拿来下载 ...