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();语句,就是程序 ...
随机推荐
- ubuntu 关闭和开启防火墙
1.关闭ubuntu的防火墙 ufw disable 2开启防火墙 ufw enable 3.卸载了iptables apt-get remove iptables 4.关闭ubuntu中的防火墙的其 ...
- python--中的文件操作
1.文件操作 把文件打开 open 打开 f = open ('文件路径',mode='模式',encoding='编码格式') #打开一个文件操作的时候取到的是一个句柄 读取的方法 . read() ...
- 使用Anaconda的python安装虚拟环境是出现错误:python -m venv venvdir----Error: Command '['D:\\Development\\Django\\test\\Scripts\\python.exe', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit
在创建python虚拟环境的时候,如果使用的是Anaconda中集成的python -m venv venvdir就会出现不能安装pip的错误,原因是Anaconda没有ensurepip, 解决办法 ...
- Stacking方法详解
集成学习方法主要分成三种:bagging,boosting 和 Stacking.这里主要介绍Stacking. stacking严格来说并不是一种算法,而是精美而又复杂的,对模型集成的一种策略. 首 ...
- 设置视口中心点setViewCenter
ads_point pt; ads_name ent,ss; //切换到模型空间 acedMspace(); if (RTNORM != acedGetPoint(NULL,_T("\n选择 ...
- WiFi安全那些事儿,整理推荐~
即使你安装了防火墙,不连接任何WIFI和热点,不在任何不受信任的网站下载东西,及时清理缓存和个人敏感信息,你相信吗?你的个人隐私仍然可能被泄露出去! 基础篇: 推荐1 谁出卖了你 << ...
- vue重构后台管理系统调研
Q4要来了,我来这家公司已经一个季度了,通过对公司前端框架的整体认识,对业务的一些认识,发现,这些东西也都是可以重构,无论是v2,还是v3的代码. 首先就要那后台管理来开刀来,现有的技术框架就是php ...
- leetcode-36-有效的数独
题目描述: 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以 ...
- C#-WebForm-★ASP.NET中的母版页★
何为母版页,顾名思义母版就是模版,就像在PPT里面的板式或主题一样,大框架已经有了,我们的任务就是向里面添加具体的内容.这样我们制作的所有幻灯片的外观大体都是一样的. 在ASP.NET中母版页有两种作 ...
- dwz+ssh Http status: 200 OK
问题描述,用超链接跳转页面的时候报这个错,原因是超链接的target没有设置对, 跳转页面应该用 target="navTab", 我原先用 target="navTab ...