----------------------------------------------------------------------------------

(1)IoC/DI的概念

 IoC --- Inversion of Control,控制反转

  IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则。IOC模式,系统中通过引入实现了IOC模式的IOC容器,即可由IOC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实 际的应用程序代码分开。其中一个特点就是通过文本的配件文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的代码。

IoC是一个很大的概念,可以用不同的方式来实现。其主要实现方式有两种:

<1>依赖查找(Dependency Lookup):容器提供回调接口和上下文环境给组件。

<2>依赖注入(Dependency Injection):组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。后者是时下最流行的IoC类型,其又有接口注入(Interface Injection),设值注入(Setter Injection)和构造子注入(Constructor Injection)三种方式。

 DI -- Dependency Injection(依赖注入)

即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中去。
  依赖注入的目标并非为软件系统带来更多的功能,而是为了提升组件重用的概率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而不需任何代码就可以指定目标需要的资源,完成自身的业务逻辑,而不用关心具体的资源来自何处,由谁实现。

(2)IoC/DI基本思想的演变

  第一个阶段:(基本阶段)

    有一个接口A和两个实现类A1、A1.

    

  如果类B想要使用类A1或者类A2的话,基本的写法如下:

 1   public class B{
2
3     public void test(){
4
5       A a = new A1();
6
7       a.method1();
8
9     }
10   }

  上面的代码中,对于B类来说是主动实例化对象,直接获取依赖,这种实现方式的缺点: 更换实现类需要重新编译源代码、耦合了实例生产者和实例消费者。

  第二个阶段:(Factory+XML)

  

  在第二个阶段中使用了工厂模式--Factory,在B类中需要使用接口A,直接去工厂里面获取:

    A a = Factory.createA();

  然后拿到a的实现后就可以调用接口的方法,这样对于B类来说是被动实例化对象,间接获取依赖,但是对于工厂类来说就是主动的,这种实现方式的缺点: 更换实现同样需要重新编译源代码。

  第三个阶段:(Factory+XML+反射)

  这个阶段是使用工厂模式+配置文件+反射,在B类里面需要使用接口A,应用工厂模式去获取:A a = Factory.createA(),然后通过a来调用接口方法。

  在工厂类里使用配置文件来决定要实例化的具体类,对于B类来说是被动创建对象,间接获取依赖;对于工厂来说也是被动创建对象.这种实现方式的缺点: 如何实例化带参数的类、如何在调用方法时传递值。

  第四个阶段:(IoC/DI)  

  

  这个阶段是IoC/DI阶段了,出现了IoC/DI容器,此时每个类想要获取什么外部资源 都可以直接去找IoC/DI容器,由IoC/DI容器来提供。

  此时由容器来创建对象和装配对象,并管理对象生命周期,对于应用程序而言,就是被动实例化被动接受依赖了。 

(3)IoC/DI的基本思想

  a.把程序之间的依赖关系去掉

  b.把程序对象设置到IoC/DI容器的配置中,作为Bean

  c.由IoC/DI容器来管理Bean的创建、实例化

  d.由IoC/DI容器来把Bean之间的关系注入到需要这些关系的对象里面

  简而言之:就是对象之间的依赖关系全部去掉,然后由IoC/DI容器来管理对象和对象之间的依赖关系。这样的好处:实现了对象之间的松散耦合

Spring.Net---2、IoC/DI基本概念的更多相关文章

  1. Spring+IOC(DI)+AOP概念及优缺点

    Spring pring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应 ...

  2. Spring.Net---3、IoC/DI深入理解

    ------------------------------------------------------------------------ 理解IoC/DI 1.控制反转 --> 谁控制谁 ...

  3. 十七、Spring框架(IOC/DI)

    一.Spring框架 Spring是一个基于IOC和AOP的结构J2EE系统的框架. 1.IOC反转控制是Spring的基础(Inversion Of Control).也就是说创建对象由以前的程序员 ...

  4. spring中的IOC/DI的知识点

    IOC(Inverse of control):控制反转;其实就是一个装对象的容器,以前我们在controller中调用service中的方法,都要先new 一个service对象,这样不符合模式设计 ...

  5. JAVAWEB 一一 框架整合(SSH,Spring+Struts2+Hibernate IOC/DI AOP声明式事务处理 定时任务)

    package org.springframework.orm.hibernate3; import java.io.Serializable; import java.util.List; impo ...

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

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

  7. IoC容器Autofac之IOC/DI基本概念(二)

    原文:http://www.cnblogs.com/xdp-gacl/p/4249939.html 1.1.IoC是什么 Ioc—Inversion of Control,即“控制反转”,一种设计思想 ...

  8. Spring再接触 IOC DI

    直接上例子 引入spring以及Junite所需要的jar包 User.java package com.bjsxt.model; public class User { private String ...

  9. spring 学习 二 IOC/DI

    中文名称:控制反转 英文名称:( Inversion of Control ) 1 控制反转作用: 一般在编写java程序时,需要程序员自己创建对象的实例,例如 A a=new A();语句,就是程序 ...

随机推荐

  1. centos7 二进制安装mysql5.6

    下载mysqltar包 wget -q http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.g ...

  2. django系列6--Ajax01 特点, 基本格式, 向前端发送数据

    一.Ajax了解 AJAX(Asynchronous Javascript And XML)优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容 优点: 1.ajax使用Java ...

  3. ADB 源码分析(一) ——ADB模块简述【转】

    ADB源码分析(一)——ADB模块简述 1.Adb 源码路径(system/core/adb). 2.要想很快的了解一个模块的基本情况,最直接的就是查看该模块的Android.mk文件,下面就来看看a ...

  4. “全栈2019”Java多线程第三章:创建多线程之实现Runnable接口

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  5. (二)SSO之CAS框架单点退出,自定义退出界面.

    用CAS的退出,只能使用它自己的那个退出界面,如果有这样的要求, 要求退出后自动跳转到登录界面, 该如何做呢?下面这篇文章实现了退出后可以自定义跳转界面.  用了CAS,发现退出真是个麻烦事,退出后跳 ...

  6. php pdo prepare真的安全吗

    详见 这里 Let's say I have code like this: $dbh = new PDO("blahblah"); $stmt = $dbh->prepar ...

  7. 2016级算法期末上机-C.简单·Bamboo's Fight with DDLs III

    简单·Bamboo's Fight with DDLs III 分析 一句话:贪心,简单哈夫曼应用,要求的其实是所有结点的值与权值的乘积之和,也就是带权路径长. 可以理解为非叶子节点的权值的和,这里的 ...

  8. jQuery 动画用法

    jQuery动画: <head> <meta charset="UTF-8"> <title>Title</title> <s ...

  9. opencv 将视频分解成图片和使用本地图片合成视频

    代码如下: // cvTest.cpp : Defines the entry point for the console application. #include "stdafx.h&q ...

  10. 【面向对象】【prototype&&__proto__&&实例化对象三者之间的关系】

    1.构造函数 a.什么是构造函数? 解释:通过关键字new 创建的函数叫做构造函数 作用:用来创建一个对象 废话少说直接上代码,首先我们还是创建一个构造函数人类 然后我们在创建两个实例,一个凡尘 一个 ...