通俗化理解Spring3 IoC的原理和主要组件
♣什么是IoC?
♣通俗化理解IoC原理
♣IoC好处
♣工厂模式
♣IoC的主要组件
♣IoC的应用实例
♣附:实例代码
1.什么是IoC(控制反转)?
Spring3框架的核心是实现控制反转(IoC)模式,IoC又叫做依赖注入(DI)。
什么是控制反转呢?答案就是“获得依赖对象的过程被反转了”,获得依赖对象的过程由自身管理对象变为由IoC容器主动注入,于是控制反转又叫做依赖注入。那么“控制反转”完全就是“依赖注入”咯?其实,我们可以将“控制反转”理解为名词,将“依赖注入”理解为动词,所以“依赖注入”用来实现“控制反转”的一种方法、手段。依赖注入就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中,最终实现对象之间的解耦。
通俗形象地理解依赖注入的过程:举计算机(对象A),usb设备(对象B),人(IoC容器)的例子。如下:
利用计算机(对象A)和usb接口实现:计算机(对象A)从usb设备中读取文件的任务。特点:1.计算机(对象A)不用关心连接的外部设备是什么,比如是u盘还是移动硬盘,计算机(对象A)只能被动接受;2.usb设备(对象B)只要符合usb的标准就ok了;3.当计算机(对象A)需要外部usb设备的时候,不用说出来,人(IoC容器)会自动帮它挂上。这就是usb设备(对象B)在系统运行时被注入到计算机(对象A)的过程。
由此可见,对象A依赖于对象B,当对象A需要用到对象B的时候,IoC容器就会立即创建一个对象B给对象A。IoC容器就是一个对象制造工厂,你需要什么,给你制造好然后送给你,你什么都不用管,包括对象是如何生成和销毁的。
2.通俗化理解IoC原理
上面已经介绍了什么是控制反转,现在再进一步啰嗦一下。控制反转的原理就是:由容器来控制程序之间的关系(以前是有程序代码直接操控,即在一个类中调用另外一个类,也就是要用到某个类的时候才手动用代码new 一个这个类的对象出来),“反转”的意思就是“控制权”的转移,控制权由应用代码中转到外部容器。
下面举个通俗的齿轮例子来说明为什么要使用IoC容器来控制程序之间的关系(如果不懂什么是“解耦”,看了这个例子你就明白了):
1.从下面的图可以看出,相互啮合的A、B、C、D四个齿轮组成一个齿轮组,用来完成某项任务。但是,如果有一个齿轮出了问题,就很有可能影响整个齿轮组的正常运转。
我们可以把齿轮组中的齿轮之间的关系,类比为软件系统中对象之间的耦合关系。对象之间的耦合是无法避免的,因为这是协同合作的基础。但随着软件的规模越来越来,比如一些工业级的软件,那么对象之间的依赖关系也会相当复杂,经常会出现对象之间的多重依赖性关系。耦合度过高,结果就会导致“牵一发而动全身”的情形。所以,为了实现对象之间的“解耦”,提出了IoC理论。
2.引入IoC容器,充当“黏合剂”的作用,使得A、B、C、D四个齿轮(对象)没有了解耦关系,这样程序员就能够更好地分工开发各个模块了。
3.IoC好处
这里还是继续使用计算机和u盘的例子来简单说明:
1.方便解耦,简化开发:计算机和u盘之间没有相关性,无论哪个出现问题都不会影响另一方。而且,因为这两种组件之间的无耦合,所以生成计算机的厂商和生成u盘的厂商可以不同。这样的话就能够更好的分工开发了。
2.易于测试:因为计算机和u盘之间的无关性,所以非常便于单元测试,分开调试和诊断。这符合spring一直贯彻的“好的设计优于具体实现,代码应易于测试”的理念。
4.工厂模式
工厂模式,顾名思义就是社会工业化带来的产品生产分工。这里的工厂指的是专门生产对象的地方,也就是声明一个类作为工厂(工厂类)用来生成其他类的实例对象。
举个例子:A组件需要B组件的协助时,不用A组件自己去实例化B组件,而是通过生产B组件的工厂(beanFactory)获取。
下面用一个factoryexample的例子来体会下:
接口person类的代码:Person.java
实现接口类的代码:
Chinese类:Chinese.java
American类:American.java
工厂类:Factory.java
测试类:Test.java
运行结果:
上面的factoryexample这个例子是用一个factory类来做对象创建的工作,在spring IoC中,我们就使用IoC容器来完成对象的创建,具体代码看iocexample这个例子,iocexample例子的代码在文章最后的附件资源里。
5.IoC的主要组件
Spring3框架的两个最基本和最重要的包:
1.org.springframework.beans.factory包(该包的主要接口是BeanFactory)
2.org.springframework.context包(该包的主要接口是ApplicationFactory)
SpringIoC框架主要组件如下:
(1).Beans
(2).配置文件(beans.xml或applicationContext.xml)
(3).BeanFactory接口及其相关类
(4).ApplicationContext接口及其相关类
使用iocexample2例子来理解 SpringIoC框架四个主要组件:
(1).Beans
Beans是指项目中提供业务的Bean,及容器要管理的Bean,如上面介绍的Chinese.java和American.java就是javaBean 。 Bean可以包含一些属性以及属性对应的getter和setter方法,也可以包含其他方法。
(2).配置文件(beans.xml或applicationContext.xml)
Spirng3通过配置文件来管理Bean,编辑配置文件这个动作又叫做“装配bean”,装配bean实际就是告诉容器需要哪些bean,以及容器如何使用IoC将它们配置起来。
配置文件包含:Bean的id、类、属性及其值; 一个<beans>元素和数个<bean>子元素。
Spring IoC框架根据Bean的id从Bean配置文件中取得该Bean的类,并生成该类的一个对象,继而从配置文件中获取该对象的属性和值。
下面是iocexample2例子的类图:
下面是iocexample2例子的配置文件(applicationContext.xml):下面的配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?xml version= "1.0" encoding= "UTF-8" ?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" [ <!ENTITY contextInclude SYSTEM "org/springframework/web/context/WEB-INF/contextInclude.xml" > ]> <beans> <!--配置Bean,注入Chinese类对象--> <bean id= "中国人" class = "iocexample2.Chinese" > <!--property元素用来指定需要容器注入的属性;name元素的指定属性值language; ref元素指定需要向language属性注入的id,即注入的对象“英语”,该对象为Englis类生成--> <property name= "language" ref= "英语" ></property> </bean> <!--注入English--> <bean id= "英语" class = "iocexample2.English" ></bean> </beans> |
iocexample2例子的运行结果:
(3).BeanFactory接口及其相关类
(4).ApplicationContext接口及其相关类
通俗化理解Spring3 IoC的原理和主要组件的更多相关文章
- 通俗化理解Spring3 IoC的原理和主要组件(spring系列知识二总结)
♣什么是IoC? ♣通俗化理解IoC原理 ♣IoC好处 ♣工厂模式 ♣IoC的主要组件 ♣IoC的应用实例 ♣附:实例代码 1.什么是IoC(控制反转)? Spring3框架的核心是实现控制反转(Io ...
- 深入理解Spring IOC工作原理
为什么会出现spring,spring出现解决了什么问题? 1.分析普通多层架构存在的问题 JSP->Servlet->Service->Dao 层与层之间的依赖很强,属于耦合而且是 ...
- Spring IOC设计原理解析:本文乃学习整理参考而来
Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. I ...
- 【死磕 Spring】----- IOC 之深入理解 Spring IoC
在一开始学习 Spring 的时候,我们就接触 IoC 了,作为 Spring 第一个最核心的概念,我们在解读它源码之前一定需要对其有深入的认识,本篇为[死磕 Spring]系列博客的第一篇博文,主要 ...
- IOC 之深入理解 Spring IoC
在一开始学习 Spring 的时候,我们就接触 IoC 了,作为 Spring 第一个最核心的概念,我们在解读它源码之前一定需要对其有深入的认识,本篇为[死磕 Spring]系列博客的第一篇博文,主要 ...
- Spring理解1 ioc
Spring Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器(框架). 需要了解 ioc容器 IOC底层原理 IOC接口 BeanFactory Bean的作用域 IOC操 ...
- Spring框架系列(6) - Spring IOC实现原理详解之IOC体系结构设计
在对IoC有了初步的认知后,我们开始对IOC的实现原理进行深入理解.本文将帮助你站在设计者的角度去看IOC最顶层的结构设计.@pdai Spring框架系列(6) - Spring IOC实现原理详解 ...
- Spring框架系列(7) - Spring IOC实现原理详解之IOC初始化流程
上文,我们看了IOC设计要点和设计结构:紧接着这篇,我们可以看下源码的实现了:Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的. ...
- Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等)
上文,我们看了IOC设计要点和设计结构:以及Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的:容器中存放的是Bean的定义即Be ...
随机推荐
- ST Debug (printf) Viewer for Jlink
Debug (printf) Viewer http://www.keil.com/support/man/docs/uv4/uv4_db_dbg_serialwin.htm Serial Windo ...
- error storage size of my_addr isn't known
- sqlserver 动态sql执行execute和sp_executesql
sp_executesql的运用 书写语法要点: exec sp_executesql @sql,N’参数1 类型1,参数2 类型2,参数3 类型3 OUTPUT’,参数1,参数2,参数3 OUTPU ...
- MS-MSMQ:百科
ylbtech-MS-MSMQ:百科 MicroSoft Message Queuing(微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可 ...
- nineoldandroids开源库
Android3.0 推出AnimationAPI ,使用起来比较方便,但是不能再3.0以下版本中使用.nineoldandroids开源库可以在任意版本上使用,官网地址:http://nineold ...
- SQL SERVER SELECT语句中加锁选项的详细说明
共享锁(读锁)和排他锁(写锁) 共享锁(S锁):共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句. 如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能 ...
- 123457123456#0#-----com.threeapp.HeiXIanBuNengPeng01----黑线不能碰
-com.threeapp.HeiXIanBuNengPeng01----黑线不能碰
- cursor -- 定义鼠标样式
cursor -- 定义鼠标样式 取值: [ [<uri> ,]* [ auto | crosshair | default | pointer | move | e-resize | n ...
- 第十章 会话管理——《跟我学Shiro》
转发地址:https://www.iteye.com/blog/jinnianshilongnian-2028675 目录贴:跟我学Shiro目录贴 Shiro提供了完整的企业级会话管理功能,不依赖于 ...
- Asp.Net Core集成Swagger
工作中一个公司会有很多个项目,项目之间的交互经常需要编写 API 来实现,但是编写文档是一件繁琐耗时的工作,并且随着 API 的迭代,每次都需要去更新维护接口文档,很多时候由于忘记或者人员交替的愿意造 ...