Spring——IoC
控制反转(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的更多相关文章
- 【初探Spring】------Spring IOC(三):初始化过程---Resource定位
		
我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然 ...
 - 【初探Spring】------Spring IOC(一)
		
IOC:Inversion of Control(控制反转).IOC它所体现的并不是一种技术,而是一种思想,一种将设计好的对象交给容器来管理的思想.IOC的核心思想就体现在控制.反转这两个词上面,要理 ...
 - spring ioc
		
spring ioc是spring的核心之一,也是spring体系的基础,那么spring ioc所依赖的底层技术是什么的?反射,以前我们开发程序的时候对象之间的相互调用需要用new来实现,现在所有的 ...
 - Spring IoC源码解析——Bean的创建和初始化
		
Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...
 - spring笔记6 spring IOC的中级知识
		
1,spring ioc的整体流程,xml配置 spring ioc初始化的流程结合上图 步骤编号 完成的工作 1 spring容器读取配置文件,解析称注册表 2 根据注册表,找到相应的bean实现类 ...
 - 谈谈对Spring IOC的理解(转)
		
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
 - 自己动手编写spring IOC源码
		
前言:对于spring IOC概念不是很了解的朋友可以阅读我上一篇博客--轻松理解spring IOC(这两篇博客也是由于我的个人原因导致现在才发布,惭愧啊).通过这篇博客的理解之后,相信大家会对sp ...
 - spring ioc   源码解析
		
什么是ioc? 通俗的解释是:(spring)框架中,完成对象的创建和注入的容器. springIOC体系结构: spring IOC的创建是典型的工厂模式,这一系列的bean工厂如上所示. 其核心是 ...
 - Spring:源码解读Spring IOC原理
		
Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. I ...
 - 谈谈对Spring IOC的理解
		
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
 
随机推荐
- 使用nsight调试caffe
			
首先你需要下载caffe源码,然后先编译好,注意一定要将Makefile.config里的DEBUG := 1注释掉 可以看到注释掉debug后编译会生成的.build_debug目录,调试过程中需要 ...
 - vue面试相关
			
(1)什么是mvvm? MVVM是Model-View-ViewModel的缩写.mvvm是一种设计思想.Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑:View ...
 - Git中文书籍
			
Git中文书籍: http://git-scm.com/book/zh/v1
 - python 深复制和浅复制
			
https://www.python-course.eu/python3_deep_copy.php-------------------------------------------------- ...
 - c++ 回调的实现
			
什么是回调?通常发生在需要两个角色即调用者与实现者的情形上,即我们希望当产生某个事件时,调用实现者定义的某个函数.当然这个概念很大,不是说操作系统的信号量,条件变量什么的,是在语言级别实现,如一个Fr ...
 - IDEA修改背景图片和主题代码风格
			
使用IDEA有一段时间了,之前为了写代码没时间折腾这玩意,以前使用Eclipse的时候一次性折腾好了,现在把之前Eclipse的配置再配到IDEA里面来,下面是效果图.Eclipse的设置见:点击这里 ...
 - 配置Mysql审计
			
mysql-audit.json:Mysql审计日志 插件下载地址: https://bintray.com/mcafee/mysql-audit-plugin/release/1.1.4-725#f ...
 - PHP程序员必须知道的两种日志
			
前言 作为一名程序员,比码代码还重要那么一点点的东西就是日志的分析和查询.下面列出常见日志及设置方法. php-fpm 慢日志 php慢日志需要在php-fpm.conf设置,如果使用源码包安装默认请 ...
 - Webdriver元素定位2(XPath)
			
XPath即为XML路径语言,它是一种用来确定XML文档中某部分位置的语言.XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力. 绝对路径定位 案例:在百度首页搜索框输入selenium ...
 - 《ajax学习》之ajax+JavaScript事件验证用户名是否可注册
			
当用户注册时,服务器数据库需要对用户输入的用户信息(以用户名为例子)进行验证,在不刷新页面的情况下又需要页面和服务器进行数据请求,最好的方法是用ajax异步请求. 一.实现思路: 1.用户输入信息 2 ...