Spring.Net---2、IoC/DI基本概念
----------------------------------------------------------------------------------
(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基本概念的更多相关文章
- Spring+IOC(DI)+AOP概念及优缺点
Spring pring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应 ...
- Spring.Net---3、IoC/DI深入理解
------------------------------------------------------------------------ 理解IoC/DI 1.控制反转 --> 谁控制谁 ...
- 十七、Spring框架(IOC/DI)
一.Spring框架 Spring是一个基于IOC和AOP的结构J2EE系统的框架. 1.IOC反转控制是Spring的基础(Inversion Of Control).也就是说创建对象由以前的程序员 ...
- spring中的IOC/DI的知识点
IOC(Inverse of control):控制反转;其实就是一个装对象的容器,以前我们在controller中调用service中的方法,都要先new 一个service对象,这样不符合模式设计 ...
- JAVAWEB 一一 框架整合(SSH,Spring+Struts2+Hibernate IOC/DI AOP声明式事务处理 定时任务)
package org.springframework.orm.hibernate3; import java.io.Serializable; import java.util.List; impo ...
- Spring中的IOC\DI\AOP等概念的简单学习
IoC(Inversion of Control,控制反转).这是spring的核心,贯穿始终, 所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系.Spr ...
- IoC容器Autofac之IOC/DI基本概念(二)
原文:http://www.cnblogs.com/xdp-gacl/p/4249939.html 1.1.IoC是什么 Ioc—Inversion of Control,即“控制反转”,一种设计思想 ...
- Spring再接触 IOC DI
直接上例子 引入spring以及Junite所需要的jar包 User.java package com.bjsxt.model; public class User { private String ...
- spring 学习 二 IOC/DI
中文名称:控制反转 英文名称:( Inversion of Control ) 1 控制反转作用: 一般在编写java程序时,需要程序员自己创建对象的实例,例如 A a=new A();语句,就是程序 ...
随机推荐
- PXE+Kickstart无人值守安装系统re
PXE(Preboot Excute Environment)预启动执行环境,可以让计算机通过网络启动系统,主要用于无人值守安装系统中引导客户端主机安装Linux操作系统. 由于之前有过使用cobbl ...
- WPF 内部Template 动画板 无法冻结此 Storyboard 时间线树供跨线程使用
解决此问题,需要一定的想象力. 换个思路即可 大体是 使用Tag或者别无用的可以输入数值的属性,或者附加属性也可以的.来绑定到你要动画的属性 当然这个过程中要使用转换器了 我给出一个关于Button ...
- “全栈2019”Java第一百零四章:匿名内部类与外部成员互访详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- iOS 基础之NSArray数组去重
1.面试题 现在有一个数组arr1,它里面存储的字符串分别为@“zhangsan”@“lisi”@“wangwu”@“lisi”@“zhangsan”,请将它去重后赋值给可变数组arr2输出为:@“z ...
- mysql 查询小技巧
数据字段中存放的是id集,形如 1,2,15,35 也可类推json格式 查询时不用拆分了, 用上 instr.concat搜索和连接字符串 查询fids中包含15的 select * from ...
- Cause: org.jetbrains.plugins.gradle.tooling.util.ModuleComponentIdentifierIm Lorg/gradle/api/artifacts/ModuleIdentifier;
今天碰到一个问题, 正常的下载gradle到本地,然后到spring官网上通过他们提供的start.spring.io创建一个demo项目, 然后在idea中打开,并配置下载的gradle到idea中 ...
- hdu 3709 Balanced Number(平衡数)--数位dp
Balanced Number Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- (转)Python3 日期和时间
Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能. Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时间间隔是以秒为单位的浮点小数. ...
- 关于javascript的各种高宽
- MySQL error2003错误原因以及解决方案
转自:http://hi.baidu.com/tianxia339/item/8e8849111461ea7e7a5f2540 出现ERROR 2003 (HY000): Can't connect ...