在学习spring的时候,最常听到的词应该就是IOC和AOP了,以下,我从我的角度再次理解一下Spring里的IOC和AOP.

IOC简单介绍

IoC(InversionofControl):IoC就是应用本身不依赖对象的创建和维护而是交给外部容器(这里为spring),这要就把应用和对象之间解耦,控制权交给了外部容器。

即Don'tcallme,I'llcallyou!所以IoC也称DI(依赖注入)对象的创建和维护依赖于外部容器.

IOC具体解释

关于IOC的博客有非常多,我们能够从这篇博客中了解一下:

    深入浅出Spring(二)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容器实现的方法网上也有非常多,在这里,我就直接站在巨人的肩膀上了:

手动模拟IOC

事实上,在Spring容器中,容器仅仅是把第三方这个类对外封装成一个xml节点,在容器中进行查询注入,注意。这里用到两个很重要的技术,一个是查找XML,还有一个是依据方法名利用反射机制调用类。我感觉假设以后想写出好的程序,这两个技术是不可缺少的。

IOC就说到这里。以下讲一下我对AOP的理解:Spring中的AOP

Spring中的IOC的更多相关文章

  1. Spring中的IOC示例

    Spring中的IOC示例 工程的大概内容是: 一个人在中国时用中国话问候大家,在国外时用英语问候大家. 其中, IHelloMessage是接口,用来定义输出问候信息 public interfac ...

  2. 详谈 Spring 中的 IOC 和 AOP

    这篇文章主要讲 Spring 中的几个点,Spring 中的 IOC,AOP,下一篇说说 Spring 中的事务操作,注解和 XML 配置. Spring 简介 Spring 是一个开源的轻量级的企业 ...

  3. 用IDEA详解Spring中的IoC和DI(挺透彻的,点进来看看吧)

    用IDEA详解Spring中的IoC和DI 一.Spring IoC的基本概念 控制反转(IoC)是一个比较抽象的概念,它主要用来消减计算机程序的耦合问题,是Spring框架的核心.依赖注入(DI)是 ...

  4. 理解Spring中的IoC和DI

    什么是IoC和DI IoC(Inversion of Control 控制反转):是一种面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度.其基本思想是:借助于"第三方" ...

  5. 理解Spring中的IOC和AOP

    我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式 IOC就是典型的工厂模式,通过ses ...

  6. 浅谈Spring中的IOC容器

    一.IOC.DI基本概念 IoC(Inversion of Control)控制反转指的是把对象的创建,初始化,销毁等工作交给容器来做.由容器控制对象的生命周期(传统方式中是由我们程序员主动创建对象. ...

  7. Spring中的IoC(控制反转)具体是什么东西

    IOC:inverse of Control: 控制反转. 意思是程序中的之间的关系,不用代码控制,而完全是由容器来控制.在运行阶段,容器会根据配置信息直接把他们的关系注入到组件中.同样,这也是 依赖 ...

  8. (二)Spring中的ioc

    目录 Spring的ioc操作 ioc底层使用的技术 ioc底层原理 ioc入门案例 bean管理(xml方式) IOC和DI的区别 Spring整合WEB的原理 Spring 整合的具体操作 Spr ...

  9. Spring中的IOC\DI\AOP等概念的简单学习

    IoC(Inversion of Control,控制反转).这是spring的核心,贯穿始终, 所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系.Spr ...

随机推荐

  1. KMP字符串模式匹配详解(zz)

    刚看到位兄弟也贴了份KMP算法说明,但本人觉得说的不是很详细,当初我在看这个算法的时候也看的头晕昏昏的,我贴的这份也是网上找的.且听详细分解: KMP字符串模式匹配详解 来自CSDN     A_B_ ...

  2. http://my.oschina.net/lenglingx/blog/205269

    http://my.oschina.net/lenglingx/blog/205269 http://www.2cto.com/os/201402/281465.html 单点登录原理: http:/ ...

  3. [Python爬虫] 之十一:Selenium +phantomjs抓取活动行中会议活动信息

    一.介绍 本例子用Selenium +phantomjs爬取活动行(http://www.huodongxing.com/search?qs=数字&city=全国&pi=1)的资讯信息 ...

  4. 浅记初次使用expect、scp中出现的一些小问题

    以前也学过一些shell,不过学得并不是很深入,动手写的代码的时间也不是很多.前不久将shell比较细的过了一遍,leader布置了任务让用shell写一个脚本将redis源码压缩包从一个服务器上传到 ...

  5. Office办公 如何打印顺丰发票

    1 关注顺丰速递,我-我的钱包 2 我的钱包-发票申请 3 勾选要打印发票的项目,点击申请发票 4 点击提交,确认发送的邮箱(他是把PDF发到指定邮箱)   最后PDF效果如下             ...

  6. C#计算时间间隔的方法小结

    初始化两个时间变量用于演示实例. DateTime dt1 = new DateTime(2013, 10, 13, 19, 15, 50); DateTime dt2 = new DateTime( ...

  7. hdu1700 Points on Cycle (数学)

    Problem Description There is a cycle with its center on the origin. Now give you a point on the cycl ...

  8. 苹果推送服务器端证书配置.pem生成

    做苹果推送服务器,很重要的一步,就是生成与苹果APNS连接的证书,一般是.pem文件: 首先在苹果开发者中心 生成 aps_devlopment.cer文件:然后下载:双击导入钥匙串: 打开钥匙串 - ...

  9. Android Exception 11(baidumapsdk(15405): Authentication Error errorcode: 102 uid)

    08-12 16:06:12.622: E/baidumapsdk(15405): Authentication Error errorcode: 102 uid: null appid -1 msg ...

  10. struts struts拦截器(过滤器)

    在struts中尽量避免自定义拦截器,因为大部分需要自己定义拦截器的时候,设计思路就不对了.大部分拦截器框架都有给你定义好了.而且如果在struts中定义拦截器相当于和这个框架绑定了,假如以后要扩展或 ...