在学习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. linux下C++修改文件内容

    C fwrite在任意位置写入文件,并可修改文件内容 想实现类似迅雷那样下载时可以从文件半中间写入的功能 #include<stdio.h> int main() { FILE *fp; ...

  2. XssEncode

    0x00 闲扯 好吧继上一篇文章之后,就没发文章了!(其实是一直在写但是写的很少还凑不起一篇文章而已) 但是这几天对插件进行了一定的改良了 因为在自己在实际的XSS过程中也发现了自己的插件 还不够强大 ...

  3. 再说rocketmq消息存储

    两篇精彩的文章: <RocketMQ源码 — 三. Producer消息发送过程> <RocketMQ源码解析:Message存储> rocketmq通过netty获取到消息请 ...

  4. 文本域光标操作(选、添、删、取)的jQuery扩展

    ; (function ($) { /* * 文本域光标操作(选.添.删.取)的jQuery扩展 @Mr.Think http://mrthink.net/text-field-jquery-exte ...

  5. 二维纹理 Texture 2D

    Textures bring your Meshes, Particles, and interfaces to life! They are image or movie files that yo ...

  6. push和unshift方法

    push和unushift都是向数组插入元素. push是向数组尾部插入元素. unshift是向数组头部插入元素. 共同点:都可以一次插入多个元素. arrayObject.push(newelem ...

  7. Visual studio之C# 新建线程与定时器的使用

    背景 App需要开线程和定时器,本文对这两种的通用方法做个记录 正文 线程 添加命名空间 using System.Threading; 创建线程 //shutdownlazer()即是线程要执行的函 ...

  8. Docker运行报Cannot connect to the Docker daemon错误

    核心问题所在:权限不足 操作docker命令提示:Cannot connect to the Docker daemon 请切换管理员权限,root权限,root安装的一般的用户访问会存在此问题.

  9. CentOS erlang安装、emqtt

    安装erlang 如果未安装以后程序,请先安装依赖   $sudo yum install gcc gcc-c++ glibc-devel make ncurses-devel openssl-dev ...

  10. epoll反应堆模型

    ================================ 下面代码实现的思想:epoll反应堆模型:( libevent 网络编程开源库 核心思想) 1. 普通多路IO转接服务器: 红黑树 ― ...