Spring中的IOC
在学习spring的时候,最常听到的词应该就是IOC和AOP了,以下,我从我的角度再次理解一下Spring里的IOC和AOP.
IOC简单介绍
IoC(InversionofControl):IoC就是应用本身不依赖对象的创建和维护而是交给外部容器(这里为spring),这要就把应用和对象之间解耦,控制权交给了外部容器。
即Don'tcallme,I'llcallyou!所以IoC也称DI(依赖注入)对象的创建和维护依赖于外部容器.
IOC具体解释
关于IOC的博客有非常多,我们能够从这篇博客中了解一下:
简单理解IOC
我们从文章中发现,事实上ioc所做的一件事情就是把A和B的强耦合关系,变成A依赖于B的接口的关系,但详细A要实现B接口中哪一种B类型,由C来决定,以达到解耦,通俗来讲,我们在家到饭点的时候就会说“我要吃饭”,我这里代表的是A,饭代表的是B的接口,可是详细是要吃什么饭。那就由你的妈妈在决定,你妈妈给你在碗里放了米饭(B)。你就要吃米饭,当然,今天你妈妈开心。也能够给你碗里放一个鸡腿,这个决定权在你的妈妈。也就是我们常说的把控制权交给第三方。
一次来达到我(A)和米饭(B)的解耦。
DI与IOC 的关系
我们可能会常常听到还有一个词:DI,这里,简单的做一下解说:
由于IOC确实不够开门见山,因此业界曾进行了广泛的讨论,终于软件界的泰斗级人物MartinFowIer提出了DI(依注入:Dependency Injection)的概念用以取代loc,即让调用类对某一接口实现类的依赖关系由第三方(容器或协作类)注入,以移除调用类对某一接口实现类的依赖。
“依賴注入”这个名词显然比“控制反转”直接明了、易于理解。
所以,我觉得IOC和DI描写叙述的是一件事情,仅仅是从不同的角度来描写叙述:
IOC控制反转:说的是创建对象实例的控制权从代码控制剥离到IOC容器控制。实际上就是我们如今说的第三方。側重于原理。
DI依赖注入:说的是创建对象实例时,为这个对象注入属性值或其他对象实例,側重于实现。
说到DI,可能就会有出现这样一个问题。既然DI側重实现,那么他是怎么实现的呢?也就是怎么注入的呢?以下我们
几种注入方式:
简单说一下几种注入方式:
第一种:构造函数注入(这里我们直接沿用上面的样例):
publicclass Team {
privateLeader leader;
publicTeam(Leader leader){
this.leader=leader;
}
public void firstMetting(){
leader.introduce();
}
}
在Boss出的代码为:
public class Boss {
public void direct(){
Leader leader = new Li();
Team team = new Team(leader);
team.firstMetting();
}
另外一种:属性注入:
有时,我们会发现,尽管小李在这个team里要发言,。但并不是每次都要发言,在这样的情况下通过构造函数注入并不妥当,这时能够考虑使用属性注入。
属性注入能够有选择地通过setter方法完毕调用类所需依赖的注入,更加灵活方便。
public class Team {
privateLeader leader。
publicvoid SetLeader (Leader leader){
this.leader=leader;
}
public void firstMetting(){
leader.introduce();
}
}
在Boss出的代码为:
public class Boss {
public void direct(){
Leader leader = new Li();
Team team = new Team();
Team.setLeader(leader);
team.firstMetting();
}
和通过构造函数注入不同。在实例化Team时。并未指定不论什么发言人,而是在实例化Team后,在须要小李出场时。才调用其setLeader方法注入扮演者。依照类似的方式。这样。我们就能够在不同的场合。注入对应的发言人了。
第三种:接口注入:
定义接口:
Public interface teamInject{
voidinjectLeader(Leader leader);
}
public class Team implements teamInject {
privateLeader leader。
publicvoid injectLeader (Leader leader){
this.leader=leader;
}
public void firstMetting(){
leader.introduce();
}
}
在Boss出的代码为:
public class Boss {
public void direct(){
Leader leader = new Li();
Team team = new Team();
Team.setLeader(leader);
team.firstMetting();
}
因为通过接口注入须要额外声明一个接口,添加了类的数目。并且它的效果和属性注
入并无本质差别,因此我们不提倡採用这样的方式。
Spring中实现IOC
当然,在这个样例中。我们是通过手动维护第三方类的,那么,Spring容器是怎么实现的呢?
spring容器实现的方法网上也有非常多,在这里,我就直接站在巨人的肩膀上了:
事实上,在Spring容器中,容器仅仅是把第三方这个类对外封装成一个xml节点,在容器中进行查询注入,注意。这里用到两个很重要的技术,一个是查找XML,还有一个是依据方法名利用反射机制调用类。我感觉假设以后想写出好的程序,这两个技术是不可缺少的。
IOC就说到这里。以下讲一下我对AOP的理解:Spring中的AOP
Spring中的IOC的更多相关文章
- Spring中的IOC示例
Spring中的IOC示例 工程的大概内容是: 一个人在中国时用中国话问候大家,在国外时用英语问候大家. 其中, IHelloMessage是接口,用来定义输出问候信息 public interfac ...
- 详谈 Spring 中的 IOC 和 AOP
这篇文章主要讲 Spring 中的几个点,Spring 中的 IOC,AOP,下一篇说说 Spring 中的事务操作,注解和 XML 配置. Spring 简介 Spring 是一个开源的轻量级的企业 ...
- 用IDEA详解Spring中的IoC和DI(挺透彻的,点进来看看吧)
用IDEA详解Spring中的IoC和DI 一.Spring IoC的基本概念 控制反转(IoC)是一个比较抽象的概念,它主要用来消减计算机程序的耦合问题,是Spring框架的核心.依赖注入(DI)是 ...
- 理解Spring中的IoC和DI
什么是IoC和DI IoC(Inversion of Control 控制反转):是一种面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度.其基本思想是:借助于"第三方" ...
- 理解Spring中的IOC和AOP
我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式 IOC就是典型的工厂模式,通过ses ...
- 浅谈Spring中的IOC容器
一.IOC.DI基本概念 IoC(Inversion of Control)控制反转指的是把对象的创建,初始化,销毁等工作交给容器来做.由容器控制对象的生命周期(传统方式中是由我们程序员主动创建对象. ...
- Spring中的IoC(控制反转)具体是什么东西
IOC:inverse of Control: 控制反转. 意思是程序中的之间的关系,不用代码控制,而完全是由容器来控制.在运行阶段,容器会根据配置信息直接把他们的关系注入到组件中.同样,这也是 依赖 ...
- (二)Spring中的ioc
目录 Spring的ioc操作 ioc底层使用的技术 ioc底层原理 ioc入门案例 bean管理(xml方式) IOC和DI的区别 Spring整合WEB的原理 Spring 整合的具体操作 Spr ...
- Spring中的IOC\DI\AOP等概念的简单学习
IoC(Inversion of Control,控制反转).这是spring的核心,贯穿始终, 所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系.Spr ...
随机推荐
- 公司机器(线上机器)启动ftp任务的命令
这个命令: /usr/local/proftp/sbin/proftpd 注意要在root账户,并且kill掉原来的同名进程.
- python学习:基础概念
Python 包管理工具解惑 python packaging 一.困惑 作为一个 Python 初学者,我在包管理上感到相当疑惑(嗯,是困惑).主要表现在下面几个方面: 这几个包管理工具有什么不同? ...
- 关于Django迁移出现问题
关于Django迁移出现问题 源码: #coding:utf- from django.db import models # Create your models here. class BookIn ...
- MS SQL 标识列的查询
摘自: http://www.2cto.com/database/201212/175000.html SQL标识列的查询 1.判段一个表是否具有标识列 www.2cto.com 可 ...
- (转)NIO 内存映射文件
内存映射文件 I/O 是一种读和写文件数据的方法,它可以比常规的基于流或者基于通道的 I/O 快得多. 内存映射文件 I/O 是通过使文件中的数据神奇般地出现为内存数组的内容来完成的.这其初听起来似乎 ...
- iOS开发之使用UICollectionView实现美团App的分类功能【偶现大众点评App的一个小bug】
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下 ...
- JavaScript的String对象
1.创建String对象 Html标签的格式编排方法:可以将String对象的字符串内容输出成对应的html标签. 示例: var str = "JavaScript程序设计"; ...
- 升级_开阔视野之Oracle图形化升级(dbca建库后升级)—10.2.0.1.0升为10.2.0.5.0
***********************************************声明*************************************************** ...
- 解决Android NDK 报jxxx编译找不到
如题 解决: 引入NDK对应的arm或者x86库 如果你用的是GinyMotion模拟器,那就引入x86库 不多说了,见截图 1.选择Propertities->C/C++ General-&g ...
- 算法笔记_061:蓝桥杯练习 字串统计(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然 ...