Spring框架中IoC(控制反转)的原理

一.IoC的基础知识以及原理:

1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。即软件系统中对象之间的耦合,对象A和对象B之间有关联,对象B又和对象C有依赖关系,这样对象和对象之间有着复杂的依赖关系,所以才有了控制反转这个理论。

2.什么是控制反转(IoC):

(1).IoC是Inversion of Control的缩写,有的翻译成“控制反转”,还有翻译成为“控制反向”或者“控制倒置”。

(2).1996年,Michael Mattson在一篇有关探讨面向对象框架的文章中,首先提出了IoC 这个概念。简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。IoC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦,如下图所示:

即把各个对象类封装之后,通过IoC容器来关联这些对象类。这样对象与对象之间就通过IoC容器进行联系,但对象与对象之间并没有什么直接联系。

如果去掉IoC容器后系统中的对象A与对象B就有了直接关系,如下图所示:

比如好多的对象类要关联起来的话,就会变得很复杂,如下图所示:

所以提出IoC控制反转是很有必要的。

(3).为什么要把这种方式叫做控制反转呢?

— 软件系统在没有引入IoC容器之前,对象A依赖对象B,那么A对象在实例化或者运行到某一点的时候,自己必须主动创建对象B或者使用已经创建好的对象B,其中不管是创建还是使用已创建的对象B,控制权都在我们自己手上。

— 如果软件系统引入了Ioc容器之后,对象A和对象B之间失去了直接联系,所以,当对象A实例化和运行时,如果需要对象B的话,IoC容器会主动创建一个对象B注入到对象A所需要的地方。

— 通过前面的对比,可以看到对象A获得依赖对象B的过程,由主动行为变成了被动行为,即把创建对象交给了IoC容器处理,控制权颠倒过来了,这就是控制反转的由来!

3.IoC的别名:依赖注入(DI)

(1).2004年,Martin Fowler探讨了同一个问题,既然IoC是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理对象变为由IoC容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection,DI)”。他的这个答案,实际上给出了实现IoC的方法:注入。

(2).所谓依赖注入,就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。

(3).所以,依赖注入(DI)和控制反转(IoC)是从不同的角度描述的同一件事情,就是指通过引入IoC容器,利用依赖关系注入的方式,实现对象之间的解耦。

4.使用IoC的好处:

(1).可维护性比较好,非常便于进行单元测试,便于调试程序和诊断故障。代码中的每一个Class都可以单独测试,彼此之间互不影响,只要保证自身的功能无误即可,这就是组件之间低耦合或者无耦合带来的好处。

(2).每个开发团队的成员都只需要关注自己要实现的业务逻辑,完全不用去关心其他人的工作进展,因为你的任务跟别人没有任何关系,你的任务可以单独测试,你的任务也不用依赖于别人的组件,再也不用扯不清责任了。所以,在一个大中型项目中,团队成员分工明确、责任明晰,很容易将一个大的任务划分为细小的任务,开发效率和产品质量必将得到大幅度的提高。

(3).可复用性好,我们可以把具有普遍性的常用组件独立出来,反复应用到项目中的其它部分,或者是其它项目,当然这也是面向对象的基本特征。显然,IoC更好地贯彻了这个原则,提高了模块的可复用性。符合接口标准的实现,都可以插接到支持此标准的模块中。

(4).IoC生成对象的方式转为外置方式,也就是把对象生成放在配置文件里进行定义,这样,当我们更换一个实现子类将会变得很简单,只要修改配置文件就可以了,完全具有热插拨的特性。

5.IoC的原理:控制反转是Spring框架的核心。其原理是基于面向对象(OO)设计原则的The Hollywood Principle:Don‘t call us, we‘ll call you(别找我,我会来找你的)。也就是说,所有的组件都是被动的,所有的组件初始化和调用都由容器负责。组件处在一个容器当中,由容器负责管理。简单的来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控,即在一个类中调用另外一个类。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,即所谓反转。

6.工厂模式:

(1).在Spring IoC中经常用到一个设计模式,即工厂模式。工厂模式提供创建对象的接口。

(2).工厂模式是指当应用程序中甲组件需要乙组件协助时,并不是在甲组件中直接实例化乙组件对象,而是通过乙组件的工厂获取,即该工厂可以生成某一类型组件的实例对象。在这种模式下,甲组件无需与乙组件以硬编码的方式耦合在一起,而只需与乙组件的工厂耦合。

(3)接下来附上一个工厂模式的例子:

首先,新建一个Java项目FactoryTest,然后新建一个接口Animal,放在com.inter包下:

Animal.java文件代码如下:

package com.inter;

public interface Animal {
	void eat();//定义抽象的吃方法
	void shout();//定义抽象的叫方法
}

然后分别新建两个JavaBean,即Dog类和Cat类,放在com.bean包下,并都实现了Animal这个接口:

Dog.java文件代码如下:

package com.bean;

import com.inter.Animal;

public class Dog implements Animal{

	@Override
	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("狗吃狗粮");
	}

	@Override
	public void shout() {
		// TODO Auto-generated method stub
		System.out.println("狗汪汪叫");
	}

}

Cat.java文件代码如下:

package com.bean;

import com.inter.Animal;

public class Cat implements Animal{

	@Override
	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("猫吃猫粮");
	}

	@Override
	public void shout() {
		// TODO Auto-generated method stub
		System.out.println("猫喵喵叫");
	}

}

接着新建一个工厂类Factory,放在com.factory,使得Dog类和Cat类在工厂类上关联起来,Dog类和Cat类并不直接关联:

Factory.java文件代码如下:

package com.factory;

import com.bean.Cat;
import com.bean.Dog;
import com.inter.Animal;

public class Factory {
	public Animal getAnimal(String name){
		if(name.equals("dog")){
			return new Dog();
		}else if(name.equals("cat")){
			return new Cat();
		}else{
			throw new IllegalArgumentException("参数不正确!");
		}
	}
}

最后,写一个Test测试类,放在com.test包下,代码如下:

package com.test;

import com.factory.Factory;
import com.inter.Animal;

public class Test {
	public static void main(String[] args){
		Animal a=null;
		a=(Animal) new Factory().getAnimal("dog");
		a.eat();
		a.shout();
		a=(Animal)new Factory().getAnimal("cat");
		a.eat();
		a.shout();
	}
}

运行后,效果如下:

二.这里先介绍IoC的基础知识和原理,IoC的主要组件和注入的两种方式,我会另外写一篇文章,以免太多大家难理解,大家先好好理解IoC的原理吧!

以上就是全部内容,写得不好,请见谅,如有错误,请指出,谢谢!

时间: 2024-10-02 22:35:36

Spring框架中IoC(控制反转)的原理的相关文章

Spring学习之Ioc控制反转(1)

开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------------------------------开始啦啦啦啦啦------------------------------------------------------------------------------- 从开始接触spring起,听到最多的就是Ioc(控制反转)和AOP(面向切面编程

Spring学习之Ioc控制反转(2)

开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------------------------------开始啦啦啦啦啦------------------------------------------------------------------------------- 上一篇博文简单的演示了如何用Spring框架创建bean,注入bean,并使用到

【框架】[Spring3]下载安装、开源框架与IoC控制反转详解

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 昨天刚刚初学Spring3,也许Spring3有点老了哈,不过还是先把3学了再去学习4吧,首先先介绍一下如何去下载Spring的必须包吧. (本篇博客适用于初学Spring的朋友) java spring4现在不推荐使用xml配置文件- 当然啦,这些知识点在Spring4还是可以用的. 不过我在这里详解的还是Spring3哈,见谅~ 下载SpringJAR包/文档: Spring官

Spring基础、IOC(控制反转)、AOP(面向切面编程)、Log4j、注解配置

学习示例代码,包含本篇介绍的Spring常用操作示例和所有所需jar文件下载地址:http://download.csdn.net/detail/daijin888888/9556697 1.什么是Spring,有什么作用 --Spring框架属于一个解决方案框架,可以对其他技术和框架进行整合应用. --*好处是:将程序中的各个组件和框架技术进行解耦,便于日后系统维护,升级和扩展操作. --在SSH中,会将Action,DAO组件都交给Spring框架管理,由Spring框架创建这些对象,建立这

Spring核心(ioc控制反转)

 IoC,Inversion Of Control 即控制反转,由容器来管理业务对象之间的依赖关系,而非传统方式中的由代码来管理. 其本质,即将控制权由应用程序代码转到了外部容器,控制权的转移就是所谓的反转,其带来的最大的好处是降低了业务对象之间的依赖程度,即实现了解耦. Spring的IoC容器主要使用DI(Dependency Injection,依赖注入)方式实现的.不需要主动查找,对象的查找.定位和创建全部由容器管理,容器会将符合依赖关系的对象通过属性(setter等)或者构造函数传

Spring中的Ioc控制反转与DI注入

Spring的控制反转 1.spring的介绍 spring是一款很受欢迎的java开源框架,核心全程围绕着BeanFactory展开,构成如下图. 2.IOC控制反转 2.1定义:把对象创建交给spring管理,不用new的方法,也不用工厂模式 2.2原理:1.xml配置文件,2.dom4j解析xml,3.工厂设计模式,4.反射 2.3使用:1.配置文件方式,2.注解方式 3.IOC注入bean管理  3.1.1 xml配置方式 1.就是xml配置文件中的spring创建对象的方式,也就是be

IOC控制反转原理

一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑.即软件系统中对象之间的耦合,对象A和对象B之间有关联,对象B又和对象C有依赖关系,这样对象和对象之间有着复杂的依赖关系,所以才有了控制反转这个理论. 2.什么是控制反转(IoC): (1).IoC是Inversion of Control的缩写,有的翻译成"控制反转",还有翻译成为"控制反向"或者&

好程序员Java干货分享Spring框架之IOC原理

好程序员Java干货分享Spring框架之IOC原理,前言:Spring框架是我们进行企业级开发的最常用框架,本章我们将了解Spring框架,并学习Spring的IOC特性以及IOC的实现原理:注解和反射. Spring框架简介 Spring是一种轻量级的控制反转(IOC)和面向切面编程(AOP)的容器框架,能够为企业级开发提供一站式服务. Spring的优点有 1.方便解耦,简化开发 通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度

Spring详解(二)------IOC控制反转

我相信提到 Spring,很多人会脱口而出IOC(控制反转).DI(依赖注入).AOP等等概念,这些概念也是面试官经常问到的知识点.那么这篇博客我们就来详细的讲解 IOC控制反转. ps:本篇博客源码下载链接:http://pan.baidu.com/s/1miwZIf2 密码:oquc 1.什么是 IOC? IOC-Inversion of Control,即控制反转.它不是什么技术,而是一种设计思想. 传统的创建对象的方法是直接通过 new 关键字,而 spring 则是通过 IOC 容器来