在学习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. 【C#】:浅谈反射机制 【转】

    http://blog.csdn.net/lianjiangwei/article/details/47207875 什么是反射? 反射提供了封装程序集.模块和类型的对象(Type 类型).可以使用反 ...

  2. hosts文件配置及主要作用

    hosts文件位于" C:\Windows\System32\drivers\etc "目录下,用于转换名字与IP地址的转换. 在浏览器中通过域名访问网站,首先查看hosts文件中 ...

  3. LVS+keepalived+nginx

    LVS是Linux Virtual Server的简写,基于4层协议不处理,不响应,只转发,速度更快 wget -c http://www.linuxvirtualserver.org/softwar ...

  4. Expression-Based Access Control

    Expression-Based Access Control Spring Security 3.0 introduced the ability to use Spring EL expressi ...

  5. Discuz常见小问题2-如何在数据库搜索指定关键字

    点击搜索,然后输入关键字,注意要全选或者部分选择表(一个数据库的表),点击右下角的执行   会提示有多少个匹配,可以在浏览器中直接搜索"1个匹配"来定位到哪个数据表找到了匹配项,然 ...

  6. jQuery EasyUI API 中文文档 - 表单(form补充)

    继承(表单验证) 第一个参数如果是true那么就算key相同也会接着追加,相反怎会覆盖 $.extend([bool],obj,obj1); var obj = {name:"zhangsa ...

  7. FPS计算New

    using UnityEngine; using System.Collections; public class CarGUI : MonoBehaviour { private const flo ...

  8. 算法笔记_080:蓝桥杯练习 队列操作(Java)

    目录 1 问题描述 2 解决方案 1 问题描述 问题描述 队列操作题.根据输入的操作命令,操作队列(1)入队.(2)出队并输出.(3)计算队中元素个数并输出. 输入格式 第一行一个数字N. 下面N行, ...

  9. apache相关配置

    PHP配置 php.ini-development:开发时的php.ini配置 php.ini-production:项目运行时的php.ini配置 复制php.ini-development文件到C ...

  10. hibernate 多对多双向关联

    package com.bjsxt.hibernate; import java.util.HashSet; import java.util.Set; import javax.persistenc ...