一、IOC简介

本文章中案例工程代码下载
IOC是inverse of control的简写,译为控制反转,是一种创建对象的思想。那什么又是控制反转呢?就是将创建对象的权力交给Spring容器,其实就是让Spring容器帮你创建对象,而你不需要在javel代码中new对象了。在没学IOC之前,在java代码中,如果你想创建类名为ClassA的对象classa,你是怎么创建对象的呢?是不是这样:

ClassA  classa=new ClassA();

但是,学了IOC之后,我们想要获取对象classa就不需要写以上语句来获取了,而是加载Spring容器,Spring容器就会创建classa对象,我们直接拿过来使用就可以了。那怎么通过IOC获取classa对象呢?请接着往下看!(本文章演示案例代码已经上传,可以到本人博客资源处下载参考学习)。

二、IOC思路

要想实现IOC控制反转,从中获取想要的对象,需要有以下条件:

  1. 想要获取对象的类或者接口和接口的实现类
  2. 创建对象的Spring容器
  3. 用来获取容器中指定对象的类的对象
  4. 用来使用从容器中获的对象的类。

解释如下:
第一,如,我们目的是想获取出类ClassA的classa,而ClassA是InterfaceA接口的实现类;
第二,那我们就需要从容器中获取,容器就是Spring配置文件xxx.xml文件,xxx.xml文件自定义是applicationContext.xml文件,也可以自定义名字,但一定得是文件;在xml文件容器中,我们需要根据规则写配置创建classa对象的代码;
第三,然后我们要加载该xml文件,用来加载Spring容器文件的类的接口是ApplicationContext接口,它有两个子实现类,分别是FileSystemXmlApplicationContextClassPathXmlApplicationContext,这两个类都可以用来加载xxx.xml文件,该文件被加载后就会创建出classa对象放在容器中等待被获;而获取方式就是通过刚刚加载xml后FileSystemXmlApplicationContext对象或lassPathXmlApplicationContext对象调用getBean()方法获取classa对象。
第四,知道如何获取classa对象后,我我们可以在其他类中获取并使用。

三、IOC实现获取对象案例操作

下面,我们用代码实现一下SpringIOC反转控制,我们现在的目的是利用IOC的方式获取类ClassA的对象classa,并使用classa对象。(ClassA是InterfaceA接口的实现类)

1.Spring工程搭建

用eclipse创建maven工程(需要在eclipse导入maven插件,eclipse中也有自带maven插件),工程名为testspringIOCDI,利用maven中的pom.xml文件导入Spring框架所需要的jar包。在pom.xml文件导包(spring、jdk):

     <!-- 建立依赖 --><dependencies><!-- 导入spring核心jar --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.6.RELEASE</version></dependency></dependencies><!-- 配置1.8jdk的环境 --><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><soure>1.8</soure><target>1.8</target><!--设置字符集 --><ceEncoding>UTF-8</ceEncoding></configuration></plugin></plugins></build>
2.创建Spring容器文件(即xxx.xml,这里我命名为SprinIOC.xml)

在容器文件/src/main/resources目录下建立SpringIOC.xml文件


在SpringIOC.xml中引入dtd规则(dtd规则任何java版本都适用,高版本java一般需要schema规则引入)。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN""https://www.springframework.org/dtd/spring-beans-2.0.dtd"><beans></beans>

SpringIOC.xml中内容解释:

3.提供javabean,即创建InterfaceA接口和其实现类ClassA

//InterfaceA接口
package testspringIOCDI.ioc;
public interface InterfaceA {public String getInfo();public void method();
}
//创建InterfaceA的实现类ClassA
package testspringIOCDI.ioc;
public class ClassA implements InterfaceA {public ClassA(){}public String getInfo() {// TODO Auto-generated method stubreturn "企业管理系统模块:实现公告发布、修改、删除等操作";}public void method(){System.out.println("I'm classA");         }
}
4.在Spring容器(SpringIOC.xml)中写创建ClassA类的对象classa的配置代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN""https://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans><description>SpringIOC</description><bean id="classa" class="testspringIOCDI.ioc.ClassA"></bean><!--  id 唯一标识,class 提供类,必须包含无参构造,相当于 ClassA classa=new ClassA(); -->
</beans>

一个bean标签就是创建一个对象。

5.获取javabean(即classa对象)并使用

创建ClassA类的测试类IOCTest,用来测试获取并使用classa对象。
IOCTes类:

package testspringIOCDI.ioc;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;/*** @author CenterLogo*create date :2019年4月25日 下午5:42:28*/
@SuppressWarnings("unused")
public class IOCTest {/*** Test method for {@link testspringIOCDI.ioc.ClassA#getInfo()}.*/@Testpublic void testGetInfo() {//通过(加载)xml容器获取上下文实例//通过规则指定xml文件ApplicationContext context=new FileSystemXmlApplicationContext("/src/main/resources/SpringIOC.xml");//方式一:根据xml中配置的ID获取的对象(ID唯一),返回Object需要强转类型InterfaceA ia=(InterfaceA) context.getBean("classa");System.out.println("方式一"+ia.getInfo());//方式二:根据ID,指定接口类型的类型获取对象(不需要强转类型)InterfaceA ia2=context.getBean("classa",InterfaceA.class);System.out.println("方式二:"+ia2.getInfo());//方式三:根据接口类型获取对象(xml配置只有一个实现类的情况下)InterfaceA ia3=context.getBean(InterfaceA.class);System.out.println("方式三:"+ia3.getInfo());context=null;//释放处理}
}

测试结果为:

方式一企业管理系统模块:实现公告发布、修改、删除等操作
方式二:企业管理系统模块:实现公告发布、修改、删除等操作
方式三:企业管理系统模块:实现公告发布、修改、删除等操作

是不是感觉使用IOC获取对象很很麻烦,还不如new简单?其实,你有没有发现,在这个案例里,在测试类中获取到classa对象只能看interface接口,而看不到ClassA类,这就体现了IOC的一个特点之一,即安全性强!,而且,降低了耦合,使配置和代码形成了分离。

什么是SpringIOC?如何理解SpringIOC?相关推荐

  1. 彻底理解 SpringIOC、DI,这篇文章就够了

    前言 你可能会有如下问题: 1.想看Spring源码,但是不知道应当如何入手去看,对整个Bean的流程没有概念,碰到相关问题也没有头绪如何下手 2.看过几遍源码,没办法彻底理解,没什么感觉,没过一阵子 ...

  2. SpringIOC的理解及源码解读(一)

    前言 本人在稀土掘金上的文章,搬到CSDN,非抄袭. 以下文字均为手敲,引用字段我会进行说明,拒绝抄袭.复制从我做起. 在Spring学习过程中,IOC是重中之重,而其中又以Bean的加载为最,故学好 ...

  3. 谈谈对springioc的理解

    https://www.cnblogs.com/xdp-gacl/p/4249939.html 转载 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概 ...

  4. Spring---IOC的理解一

    一,对象应用的革命 革命一(原始时代):需要怎么对象,就创建相应的对象,执行相应的功能.(这大大降低了维护性,修改时要改原码,违反开-闭原则"扩展开修改闭") 革命二(封建时代): ...

  5. Spring-IOC入门理解

    新建一个Maven工程 在pom文件中导入需要的依赖 <?xml version="1.0" encoding="UTF-8"?> <proj ...

  6. 数据交换格式与SpringIOC底层实现

    课程目标 XML和JSON Java反射机制 手写SpringIOC 什么是数据交换格式 客户端与服务器常用数据交换格式xml.json.html 数据交换格式用场景 移动端(安卓.IOS)通讯方式采 ...

  7. Java 数据交换格式反射机制SpringIOC原理分析

    数据交换格式&反射机制&SpringIOC原理分析 什么是数据交换格式? 数据交换格式使用场景 JSON简单使用 什么是JSON? JSON格式的分类 常用JSON解析框架 使用fas ...

  8. SpringIOC概述

    什么是SpringIOC 什么是SpringIOC,就是把每一个bean(实体类)与bean(实体了)之间的关系交给第三方容器进行管理. 什么是SpringIOC底层实现原理 1.读取bean的XML ...

  9. 手动编写SpringIOC框架

    一.什么是SpringIOC 什么是SpringIOC,就是把每一个bean(实体类)与bean(实体了)之间的关系交给第三方容器进行管理. Xml配置: <beans><bean ...

最新文章

  1. hdfs 数据迁移_基于JindoFS+OSS构建高效数据湖
  2. 通过QuartzCore/CoreAnimation.h实现让玫瑰花飞舞
  3. 理解 Glance - 每天5分钟玩转 OpenStack(20)
  4. mysql多线程复制binlog_MySQL并发复制系列一:binlog组提交 (转载)
  5. linux lsm模块,Linux安全模块LSM研究及改进
  6. unix和linux命令_Linux / Unix系统中SSH命令的用法
  7. idea下载github代码及切换分支
  8. Android O后台服务限制总结
  9. 《实施Cisco统一通信管理器(CIPT1)》一1.3 总结
  10. Matlab2017b配置C++/C/Fortan编译器的问题(已解决)
  11. NAR:蛋白功能层级注释数据库eggNOG5
  12. linux系统下查找应用,Linux系统find查找命令运用
  13. ZT世界第九大奇迹--北京西直门立交桥〔爆笑〕
  14. adb install -r -d的含义
  15. 全新UI宝宝起名神器小程序源码+样式非常美观
  16. 流 (输入流、输出流)理解。
  17. [Unity基础]GL图像库
  18. 绿色石化高质量发展 茂名天源石化碳三碳四资源利用项目开工
  19. ROS2学习笔记13--编写一个简单的发布器和侦听器(C++)
  20. 大厂程序员推荐的linux内核学习路线

热门文章

  1. 京城最惨地产商:股价跌到8毛1,滞留海外曾为女星豪掷1亿
  2. Linux内核win_minmax代码解读
  3. ES6/ES7新特性
  4. javascript秘密花园读书笔记
  5. ElasticSearch搜索引擎✧完结
  6. mysql insert 源码_MySQL insert源码走读
  7. 计算机系统基础(六)之RISC-V汇编
  8. SDL游戏开发之三-瓦片地图
  9. 医学图像分割制作标签数据
  10. 【数据库】数据库设计