控制反转(Inversion ofControl,英文缩写为IoC)是一种能够解耦的方法,不是什么技术。是一种思想,也是轻量级的Spring框架的核心。控制反转一般分为两种类型。依赖注入(DependencyInjection。简称DI)和依赖查找。

控制反转是,关于一个对象怎样获取他所依赖的对象的引用。这个责任的反转。

我们通过一个样例体会IoC的优点:

数据模型例如以下:

Human接口:

	package sping.tgb.ioc;

	public interface Human {

		public void eat();
public void sleep(); }

Student类:

	package sping.tgb.ioc;

	public class Student implements Human {

		public void eat() {
System.out.println("学生吃饭"); } public void sleep() {
System.out.println("学生睡觉"); } }

Teacher类:

	package sping.tgb.ioc;

	public class Teacher implements Human {

		public void eat() {
System.out.println("老师吃饭"); } public void sleep() {
System.out.println("老师睡觉"); } }

用工厂模式:

我们假设要在client调用这两个类,不用控制反转的话,能够用工厂实现,例如以下:

工厂类:

	package sping.tgb.ioc;

	public class Factory {

		public final static String TEACHER = "teacher";
public final static String STUDENT = "student"; public Human getHuman(String ethnic) {
if (ethnic.equals(TEACHER))
return new Teacher();
else if (ethnic.equals(STUDENT))
return new Student();
else
throw new IllegalArgumentException("參数(职业)错误");
}
}

client:

	public static void main(String[] args) {

			Human human =null;

			human=new Factory().getHuman(Factory.STUDENT);
human.eat();
human.sleep(); human=new Factory().getHuman(Factory.TEACHER);
human.eat();
human.sleep(); }

输出结果:

用Spring:

用工厂我们做到了解耦和。client不用知道详细的调用类,由工厂推断。以下我们看一下用控制反转我们怎样做:

使用spring。我们就不用写工厂类,直接写配置文件,例如以下:

client:

	public static void main(String[] args) {

			BeanFactory beanFactory=null;
beanFactory=new ClassPathXmlApplicationContext("applicationContext.xml"); Human human = null;
human = (Human) beanFactory.getBean("student");
human.eat();
human.sleep();
human = (Human) beanFactory.getBean("teacher");
human.eat();
human.sleep(); }

输出结果:

对照:

大家能够看到用IoC和用工厂的作用基本是一致的,那为什么还要用IoC呢?优势在哪里?

Spring做到了解耦,上一层不依赖下一层的详细类,相同。工厂也做到了。

可是用Spring当需求发生变化时仅仅要改动配置文件,不用又一次编译系统;而用工厂当需求发生变化须要添加或删除、改动类时,须要又一次编译。这样能够说Spring做到了热插拔。

总结:

IoC的灵活性是有代价的:设置步骤麻烦、生成对象的方式不直观、反射比正常生成对象在效率上慢一点。因此并非不论什么地方都适合用IoC的。用到工厂模式的地方都能够考虑用IoC模式。

Spring——IoC的更多相关文章

  1. 【初探Spring】------Spring IOC(三):初始化过程---Resource定位

    我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然 ...

  2. 【初探Spring】------Spring IOC(一)

    IOC:Inversion of Control(控制反转).IOC它所体现的并不是一种技术,而是一种思想,一种将设计好的对象交给容器来管理的思想.IOC的核心思想就体现在控制.反转这两个词上面,要理 ...

  3. spring ioc

    spring ioc是spring的核心之一,也是spring体系的基础,那么spring ioc所依赖的底层技术是什么的?反射,以前我们开发程序的时候对象之间的相互调用需要用new来实现,现在所有的 ...

  4. Spring IoC源码解析——Bean的创建和初始化

    Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...

  5. spring笔记6 spring IOC的中级知识

    1,spring ioc的整体流程,xml配置 spring ioc初始化的流程结合上图 步骤编号 完成的工作 1 spring容器读取配置文件,解析称注册表 2 根据注册表,找到相应的bean实现类 ...

  6. 谈谈对Spring IOC的理解(转)

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

  7. 自己动手编写spring IOC源码

    前言:对于spring IOC概念不是很了解的朋友可以阅读我上一篇博客--轻松理解spring IOC(这两篇博客也是由于我的个人原因导致现在才发布,惭愧啊).通过这篇博客的理解之后,相信大家会对sp ...

  8. spring ioc 源码解析

    什么是ioc? 通俗的解释是:(spring)框架中,完成对象的创建和注入的容器. springIOC体系结构: spring IOC的创建是典型的工厂模式,这一系列的bean工厂如上所示. 其核心是 ...

  9. Spring:源码解读Spring IOC原理

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

  10. 谈谈对Spring IOC的理解

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

随机推荐

  1. 三个层面学playbook(核心)

    三个层面学playbook(核心) ansible-playbook是ansible工具中的核心,对比ad-hoc(ansible)命令,可以把playbook理解为一系列动作的组成,结果传递.判断等 ...

  2. vue 自定义指令使用

    <template> <div> <!-- 让input元素在打开页面的时候就获得焦点 --> <input type="text" v- ...

  3. CF919F A Game With Numbers

    题目:(luogu翻译错的很多) Alice和Bob玩游戏,每人有8张牌,牌的值为0~4.每一轮当前玩家选择自己的牌A和对手的牌B,然后将A的值变为( A + B )%5,其中A和B都不是0. 当一个 ...

  4. 利用端口转发来访问virtualbox虚拟机centos6的jupyter notebook

    1.除了在virtualbox中设置常规的端口转发外,还需要在windows上打开cmd,输入ssh -N -f -L localhost:8888:localhost:8889 -p 22 root ...

  5. Nginx的初识

    今日刚接触了解到Nginx的反向代理,正向代理,并发,集群,同个站点不同域名的解析访问等等. 1.反向代理:Nginx充当一个桥接的作用,对用户和服务端进行链接,进行服务端的代理,这样有什么好处: a ...

  6. Mac使用Aria2下载百度网盘,突破下载限速的方法教程

    百度网盘目前可以说是在国内网盘环境中一枝独秀,日常使用触及在所难免,尤其是对于喜欢下载资源的朋友来说,但是一些限制让它的使用越来越难,尤其是下载速度,普通用户的下载往往远低于自己的预期,特别是对于 M ...

  7. Django 模版语法 二

    变量的过滤器(filter)的使用 过滤器:upper, lower, first, capfirst 在 views.py 中修改 from django.shortcuts import rend ...

  8. 82-Ichimoku Kinko Hyo 一目平衡表.(2015.7.3)

    Ichimoku Kinko Hyo 一目平衡表 计算: 一目平衡图由五组参数合成,与现在常用的移动平均线吻合.参数基于各个长短周期的高低点,提供一明确简单的走势图.五个参数如下: 1.短轴快线 短轴 ...

  9. 关于Google浏览器Unable to preventDefault inside passive event listener due to target being treated as passive.的解决方案

    最近写react项目的时候,引用了antd-mobile,在使用滚动组件的时候,发现谷歌浏览器会报以下警告 最初我以为是antd-mobile的问题导致的,然后我就无查看了之前的vue的项目,发现了类 ...

  10. 对Spring框架的理解(转)

    ①  spring框架是一个开源而轻量级的框架,是一个IOC和AOP容器 ② spring的核心就是控制反转(IOC)和面向切面编程(AOP) ③  控制反转(IOC):是面向对象编程中的一种设计原则 ...