Spring.NET学习笔记1——控制反转(基础篇) Level 200
在学习Spring.NET这个控制反转(IoC)和面向切面(AOP)的容器框架之前,我们先来看一下什么是控制反转(IoC)。
控制反转(Inversion of Control,英文缩写为IoC),也叫依赖注入(Dependency Injection)。我个人认为控制反转的意思是依赖对象(控制权)发生转变,由最初的类本身来管理依赖对象转变为IoC框架来管理这些对象,使得依赖脱离类本身的控制,从而实现松耦合。
我们先来看一段代码
namespace Dao
{
public interface IPersonDao
{
void Save();
}
public class PersonDao : IPersonDao
{
public void Save()
{
Console.WriteLine("保存 Person");
}
}
}
namespace SpringNetIoC
{
class Program
{
private static void NormalMethod()
{
IPersonDao dao = new PersonDao();
dao.Save();
Console.WriteLine("我是一般方法");
}
}
}
Program必然需要知道IPersonDao接口和PersonDao类。为了不暴露具体实现,我可以运用设计模式中的抽象工厂模式(Abstract Factory)来解决。
{
public static class DataAccess
{
public static IPersonDao CreatePersonDao()
{
return new PersonDao();
}
}
}
namespace SpringNetIoC
{
class Program
{ private static void FactoryMethod()
{
IPersonDao dao = DataAccess.CreatePersonDao();
dao.Save();
Console.WriteLine("我是工厂方法");
}
}
}
这时,Program只需要知道IPersonDao接口和工厂,而不需要知道PersonDao类。然后我们试图想象,要是有这样的工厂框架帮我们管理依赖的对象就好了,于是控制反转出来了。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" />
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
</sectionGroup>
</configSections>
<spring>
<context>
<resource uri="config://spring/objects" />
</context>
<objects xmlns="http://www.springframework.net">
<description>一个简单的控制反转例子</description>
<object id="PersonDao" type="Dao.PersonDao, Dao" />
</objects>
</spring>
</configuration>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dao;
using DaoFactory;
using Spring.Context;
using Spring.Context.Support;
namespace SpringNetIoC
{
class Program
{
static void Main(string[] args)
{
//NormalMethod(); // 一般方法
//FactoryMethod(); // 工厂方法
IoCMethod(); // IoC方法"
Console.ReadLine();
}
private static void NormalMethod()
{
IPersonDao dao = new PersonDao();
dao.Save();
Console.WriteLine("我是一般方法");
}
private static void FactoryMethod()
{
IPersonDao dao = DataAccess.CreatePersonDao();
dao.Save();
Console.WriteLine("我是工厂方法");
}
private static void IoCMethod()
{
IApplicationContext ctx = ContextRegistry.GetContext();
IPersonDao dao = ctx.GetObject("PersonDao") as IPersonDao;
if (dao != null)
{
dao.Save();
Console.WriteLine("我是IoC方法");
}
}
}
}
一个简单的控制反转程序例子就实现了。
这样从一定程度上解决了Program与PersonDao耦合的问题,但是实际上并没有完全解决耦合,只是把耦合放到了XML 文件中,通过一个容器在需要的时候把这个依赖关系形成,即把需要的接口实现注入到需要它的类中。我个人认为可以把IoC模式看做是工厂模式的升华,可以把IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的。
代码下载
我最近也是在学习Spring.NET,如果有和我不同意见的朋友可以给我留言或者发送EMail,我们可以约定时间共同学习和探讨。
返回目录
转载于:https://www.cnblogs.com/GoodHelper/archive/2009/10/25/Spring_NET_IoC.html
Spring.NET学习笔记1——控制反转(基础篇) Level 200相关推荐
- Spring.NET学习笔记22——整合WCF(应用篇) Level 200
Spring.NET对WCF(Windows Communication Foundation)有很好的支持,Spring.Services程序集下封装了创建和调用WCF的方法.以往,我们使用svc文 ...
- 强化学习笔记(一)基础篇
强化学习笔记(一)基础篇 目录 1.强化学习相关概念 2.强化学习与监督学习和非监督学习的区别 3.强化学习分类 4.三对重要概念 目录 写在前面:本文系小编学习邹伟老师等人编著的<强化学习&g ...
- FPGA系统性学习笔记连载_Day1数字电路基础篇
FPGA系统性学习笔记连载_Day1数字电路基础篇 连载<叁芯智能FPGA设计与研发就业班-第一天> <数字电路基础1> 原创作者:紫枫术河 转载请联系群主授权,否则追究责任 ...
- HFSS学习笔记(一)基础篇 操作界面简介和使用前的准备工作
HFSS学习笔记(一)基础篇 操作界面简介和使用前的准备工作 一.HFSS工作界面简介 各区域的功能: 二.设计的步骤 1.创建工程文件 2.进行设计前的准备工作 一.HFSS工作界面简介 各区域的功 ...
- Spring.NET学习笔记10——方法的注入(基础篇) Level 200
多数用户都会将容器中的大部分对象布署为singleton模式.当一个singleton对象需要和另一个singleton对象协作,或者一个非singleton对象需要和另一个非singleson对象协 ...
- pythonsze_python学习笔记二 数据类型(基础篇)
Python基础 对于Python,一切事物都是对象,对象基于类创建 不同类型的类可以创造出字符串,数字,列表这样的对象,比如"koka".24.['北京', '上海', '深圳' ...
- Spring.NET学习笔记11——自定义对象行为(基础篇) Level 200
Spring.NET通过几个专门的接口来控制容器中对象的行为.说到对象的行为无非就要提到对象的生命周期控制.类似在WinForm开发,Form生命周期中,Load方法为Form的载入方法和Dispos ...
- Spring.NET学习笔记15——AOP的配置(基础篇) Level 200
上篇我学习了Spring.NET的四种通知类型,AOP的实现方案比较复杂,是通过代码实现的.而Spring.NET框架给我们提供了配置的方式来实现AOP的功能.到目前为止,我们已经讨论过使用Proxy ...
- Spring.NET学习笔记13——AOP的概念(基础篇) Level 200
上篇我们简单的了解了AOP的应用场景,知道AOP编程的重要性.这篇我们先看一段代码,来开始今天的学习. 回顾与上篇类似的代码:SecurityService类的IsPass判断用户名为"ad ...
最新文章
- RNN循环神经网络的直观理解:基于TensorFlow的简单RNN例子
- 图像传感器与信号处理——详解图像传感器噪声
- beego原生mysql查询_Beego基础学习(五)Golang原生sql操作Mysql数据库增删改查(基于Beego下测试)...
- Moody Photoshop Panel for mac(ps专业色彩调色扩展面板)
- python从零开始基础入门——开发环境搭建
- python二次开发odoo_odoo二次开发 - 战鹏的Blog - OSCHINA - 中文开源技术交流社区
- C++ 调用批处理命令或者.bat(.cmd)文件或者.exe文件
- AWVS14.5最新版的安装与使用
- 一行代码显示WiFi密码
- 海外国外支付渠道接口对接
- 一加5t Android 第三方系统上BL锁
- 关于两个鸡蛋判断楼层问题
- 2021年中国互联网广告市场年度分析
- 基于Egteks mPower1203仪器和KEYSIGHT N6705仪器的一款智能穿戴产品的低功耗电流测试评估
- 十进制转二、八、十六进制
- 芯片RK3399性能介绍
- 浅析物联网的商业模式
- vue 中使用 marked + highlight.js 代码高亮
- 东北林业大学OJ题目2
- 什么是Hibernate方言和方言列表
热门文章
- MySQL SQL的概述
- spring data jpa实现有条件的分页查询功能
- 查看systemctl或service启动服务日志
- mysql explain理解
- Qt C++中 Map 和 List 转换到 QML 中使用
- 张秋余---经典语录
- html div阴影向上,css3阴影向上缓动样式
- oracle 删除列 大数据_Oracle 删除指定sql的执行计划。
- 无水印pdf编辑器_偷偷告诉你如何编辑PDF文件,轻松解决这万恶的千古难题
- 程序 峰谷值 提取_ABAQUS:Python后处理—用excel提取位移、体积、应变等变化(一)...