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这两个概念是模糊不清的,是很难理解的,今天和大家 ...
随机推荐
- 华硕笔记本无法设置U盘启动,快捷启动不能识别
最近有不少华硕笔记本用户朋友在使用U大侠装系统时,不管是使用快捷键启动还是BIOS查看,都没有发现U盘启动项,这该怎么办呢? 不要急,既然找不到启动项,那就从设置启动项来解决不就可以了. 第一种方 ...
- velocity(vm)模板引擎基本语法
for循环 #foreach($acc in $!{param.tools}) #set($count = $count + 1) <li custom-data="$!{acc.or ...
- Parker Gear Pump - Gear Pump Seal Is More O-Ring: Role
Parker Gear Pump introduction Gear pump lip seal is mainly used in reciprocating dynamic seals. C ...
- extjs中Store和grid的刷新问题
问题1:Store.load() 和Store.setproxy()区别 问题2:修改后的Grid 更新: Store.reload() 问题3,store删除后刷新会出问题 Store移除一行:St ...
- Linux从入门到适应(三):Ubuntu16.04将python从3.5升级到3.6
1 将python从默认的python2.7更换为python3.5 : sudo update-alternatives --install /usr/bin/python python /usr/ ...
- [Python3网络爬虫开发实战] 5.3-非关系型数据库存储
NoSQL,全称Not Only SQL,意为不仅仅是SQL,泛指非关系型数据库.NoSQL是基于键值对的,而且不需要经过SQL层的解析,数据之间没有耦合性,性能非常高. 非关系型数据库又可细分如下. ...
- CodeForcesGym 100517H Hentium Scheduling
Hentium Scheduling Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForc ...
- HDU-1163Eddy's digital Roots,九余定理的另一种写法!
下午做了NYOJ-424Eddy's digital Roots后才正式接触了九余定理,不过这题可不是用的九余定理做的.网上的博客千篇一律,所以本篇就不发篇幅过多介绍九余定理了: 但还是要知道什么是九 ...
- Amoeba新版本MYSQL读写分离配置
标签:mysql 数据库 读写分离 休闲 amoeba 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://skyson.blog.5 ...
- LA3263 一笔画
题目大意:依次给定多个点(要求第一个点和最后一个点重叠),把前后两个点相连求最后得到的图形的面的个数 根据欧拉定理: 设平面图的顶点数为V,边数为E,面数为F,则V+F-E = 2 这里的E是指如果一 ...