♣什么是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

package factoryexample;

public interface Person {
void eat();//定义抽象的吃方法
void drink();//定义抽象的喝方法
}

实现接口类的代码:

Chinese类:Chinese.java

package factoryexample;

public class Chinese implements Person{
public void eat()
{
System.out.println("中国人喜欢吃中餐!");
}
public void drink()
{
System.out.println("中国人喜欢喝开水!");
}
}

 American类:American.java

package factoryexample;

public class American implements Person{
public void eat()
{
System.out.println("美国人喜欢吃西餐!");
}
public void drink()
{
System.out.println("美国人喜欢喝咖啡!");
}
}

 工厂类:Factory.java

package factoryexample;

public class Factory {
public Person getPerson(String name)
{
if(name.equals("中国人"))
return new Chinese();
else if(name.equals("美国人"))
return new American();
else
throw new IllegalArgumentException("参数不正确!");
}
}

 测试类:Test.java

package factoryexample;

public class Test {
public static void main(String[] args) {
Person person=null;
person=new Factory().getPerson("中国人");
person.eat();
person.drink();
person=new Factory().getPerson("美国人");
person.eat();
person.drink();
}
}

  运行结果:

 

上面的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):下面的配置文件

<?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的最后的两个主要组件就先放到下篇再讲。


spring系列目录:

通俗化理解Spring3 IoC的原理和主要组件(知识二总结)

Spring3 IoC主要组件详解(知识三总结)

通俗化理解Spring3 IoC的原理和主要组件(spring系列知识二总结)的更多相关文章

  1. 通俗化理解Spring3 IoC的原理和主要组件

      ♣什么是IoC? ♣通俗化理解IoC原理 ♣IoC好处 ♣工厂模式 ♣IoC的主要组件 ♣IoC的应用实例 ♣附:实例代码 1.什么是IoC(控制反转)? Spring3框架的核心是实现控制反转( ...

  2. Spring系列(二):Spring IoC应用

    一.Spring IoC的核心概念 IoC(Inversion of Control  控制反转),详细的概念见Spring系列(一):Spring核心概念 二.Spring IoC的应用 1.定义B ...

  3. 深入理解Spring系列之二:BeanDefinition解析

    转载 https://mp.weixin.qq.com/s?__biz=MzI0NjUxNTY5Nw==&mid=2247483814&idx=1&sn=ddf49931d55 ...

  4. Spring系列之IOC的原理及手动实现

    目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 导语 Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架.也是几乎所有J ...

  5. Spring系列之AOP的原理及手动实现

    目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 引入 到目前为止,我们已经完成了简易的IOC和DI的功能,虽然相比如Spring来说肯定是非常简陋的,但是毕竟我 ...

  6. Spring系列之DI的原理及手动实现

    目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 前言 在上一章中,我们介绍和简单实现了容器的部分功能,但是这里还留下了很多的问题.比如我们在构造bean实例的时 ...

  7. Spring系列(三):Spring IoC源码解析

    一.Spring容器类继承图 二.容器前期准备 IoC源码解析入口: /** * @desc: ioc原理解析 启动 * @author: toby * @date: 2019/7/22 22:20 ...

  8. Spring IOC设计原理解析:本文乃学习整理参考而来

    Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. I ...

  9. Spring系列之谈谈对Spring IOC的理解

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IOC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

随机推荐

  1. POJ 1163 The Triangle【dp+杨辉三角加强版(递归)】

    The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 49955   Accepted: 30177 De ...

  2. Codeforces 810C Do you want a date?(数学,前缀和)

    C. Do you want a date? time limit per test:2 seconds memory limit per test:256 megabytes input:stand ...

  3. Kruskal求最小生成树

    #include<bits/stdc++.h> using namespace std; ; ; const int inf = 0x3f3f3f3f; ; typedef long lo ...

  4. JAVA经典算法面试40题及答案

    现在是3月份,也是每年开年企业公司招聘的高峰期,同时有许多的朋友也出来找工作.现在的招聘他们有时会给你出一套面试题或者智力测试题,也有的直接让你上机操作,写一段程序.算法的计算不乏出现,基于这个原因我 ...

  5. linux安装navicat全程记录

    国庆期间自己在试着用linux(ubuntu),献上navicat安装方法,以及很多教程里没有写的一些小东西 step1: 去navicat官网下载安装包,网址:http://www.navicat. ...

  6. JAVA:创建类和对象

    package duixiang; public class duixiang { /* * 类的实例化:创建对象 */ public static void main(String[] args) ...

  7. spring定时任务执行两次 项目重复初始化 项目启动两次

    tomcat/config/server.xml中Host标签Context节点的问题 项目里quartz定时器总是被执行2次,通过打印发现原来项目被加载了两次,所以项目下的Listener被重复加载 ...

  8. SQL的各种连接(cross join、inner join、full join)的用法理解

    SQL中的连接可以分为内连接,外连接,以及交叉连接 . 1. 交叉连接CROSS JOIN 如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积: 举例, ...

  9. geotools实现多边形的合并&缓冲区

    这算是第一次接触开源工具包,说实话刚开始有点不知所措,中途遇到很多问题的时候也感觉头皮发麻,不过很高兴自己还是坚持下来了. geotools就不做过多的介绍了,想总结一下如何根据开源内容做自己的项目. ...

  10. 将自己的代码托管到github上

    这几天一直在做一个爬虫的小demo,代码基本写的差不多了,想着如何把他放在一个地方,如是乎注册了一个github账号,开始了自己的git之旅. 首先是下载git,这个我就不多说啦!到处都有推荐看看廖雪 ...