Spring.NET IoC容器的用法。

通过简单的例子学习Spring.Net

1、先创建一个控制台程序项目。

2、添加IUserInfoDal 接口。

namespace Spring.Net
{
public interface IUserInfoDal
{
void Show();
}
}

3、添加AdoNetUserInfoDal类和EFUserInfoDal类,继承IUserInfoDal接口。

AdoNetUserInfoDal.cs

public class AdoNetUserInfoDal:IUserInfoDal
{
public void Show()
{
Console.WriteLine("我是 AdoNet Dal );
}
}

EFUserInfoDal.cs

public class EFUserInfoDal: IUserInfoDal
{
public void Show()
{
Console.WriteLine("我是EF Dal);
}
}

4、引用Spring.Net程序集 Spring.Core.dll 和 Common.Logging.dll

5、添加Spring.Net配置节点,配置object节点

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--一定要在紧跟着configuration下面添加-->
<configSections>
<!--跟下面Spring.Net节点配置是一一对应关系-->
<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> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup> <!--Spring.Net节点配置-->
<spring>
<context>
<!--容器配置-->
<resource uri="config://spring/objects"/>
</context>
<objects xmlns="http://www.springframework.net">
<!--这里放容器里面的所有节点-->
<description>An example that demonstrates simple IoC features.</description>
<!--name 必须要唯一的,type=类的全名称,所在的程序集-->
<object name="UserInfoDal" type="Spring.Net.EFUserInfoDal, Spring.Net">
</object>
</spring>
</configuration>

6、开始写主函数,创建spring容器上下文

namespace Spring.Net
{
class Program
{
static void Main(string[] args)
{
//控制权没有反转
//IUserInfoDal infoDal = new EFUserInfoDal(); //Spring.Net 创建实例的方式转为容器帮我们创建
//创建spring容器上下文
IApplicationContext ctx = ContextRegistry.GetContext();
//通过容器创建对象
IUserInfoDal efDal = ctx.GetObject("UserInfoDal") as IUserInfoDal;
efDal.Show();
Console.ReadKey();
}
}
}

7、属性注入

<!--Spring.Net节点配置-->
<spring>
<context>
<!--容器配置-->
<resource uri="config://spring/objects"/>
</context>
<objects xmlns="http://www.springframework.net">
<!--这里放容器里面的所有节点-->
<description>An example that demonstrates simple IoC features.</description>
<!--name 必须要唯一的,type=类的全名称,所在的程序集-->
<object name="UserInfoDal" type="Spring.Net.EFUserInfoDal, Spring.Net">
<property name="Name" value="张三"/>
<!--ref指向下面的属性注入-->
<property name="UserInfo" ref="UserInfo"/>
</object> <!--属性注入-->
<object name="UserInfo" type="Spring.Net.UserInfo, Spring.Net">
<property name="Name" value="李四"/>
<property name="Age" value="15"/>
</object>
</objects>
</spring>

8、构造函数注入

<!--构造函数注入-->
<object name="UserInfoDal2" type="Spring.Net.AdoNetUserInfoDal, Spring.Net">
<constructor-arg index="0" value="张三"/>
<constructor-arg index="1" ref="UserInfo"/>
</object>

9、容器配置

<context>
<!--容器配置-->
<resource uri="config://spring/objects"/>
<!--xml文件方式,更改属性,复制到输出目录:始终复制-->
<!--<resource uri="file://objects.xml"/>-->
<!--嵌入程序集方式,assembly://程序集名/项目名/objects.xml,更改属性,始终复制,生成操作,嵌入的资源-->
<!--<resource uri="assembly://Spring.Net/Spring.Net/objects.xml"/>-->
</context>

10、完整例子

IUserInfoDal.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Spring.Net
{
public interface IUserInfoDal
{
UserInfo UserInfo { get; set; }
string Name { get; set; } void Show();
}
}

AdoNetUserInfoDal.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Spring.Net
{
public class AdoNetUserInfoDal:IUserInfoDal
{
public AdoNetUserInfoDal(string name, UserInfo userInfo)
{
Name = name;
UserInfo = userInfo;
}
public UserInfo UserInfo { get; set; }
public string Name { get; set; } public void Show()
{
Console.WriteLine("我是 AdoNet Dal ,属性注入:Name=" + Name);
Console.WriteLine("UserInfo ,Name=" + UserInfo.Name + " Age=" + UserInfo.Age);
}
}
}

EFUserInfoDal.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Spring.Net
{
public class EFUserInfoDal: IUserInfoDal
{
public EFUserInfoDal()
{ }
public UserInfo UserInfo { get; set; }
public string Name { get; set; } public void Show()
{
Console.WriteLine("我是EF Dal,属性注入:Name=" + Name);
Console.WriteLine("UserInfo ,Name=" + UserInfo.Name + " Age=" + UserInfo.Age);
}
}
}

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--一定要在紧跟着configuration下面添加-->
<configSections>
<!--跟下面Spring.Net节点配置是一一对应关系-->
<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> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup> <!--Spring.Net节点配置-->
<spring>
<context>
<!--容器配置-->
<resource uri="config://spring/objects"/>
<!--xml文件方式,更改属性,复制到输出目录:始终复制-->
<!--<resource uri="file://objects.xml"/>-->
<!--嵌入程序集方式,assembly://程序集名/项目名/objects.xml,更改属性,始终复制,生成操作,嵌入的资源-->
<!--<resource uri="assembly://Spring.Net/Spring.Net/objects.xml"/>-->
</context>
<objects xmlns="http://www.springframework.net">
<!--这里放容器里面的所有节点-->
<description>An example that demonstrates simple IoC features.</description>
<!--name 必须要唯一的,type=类的全名称,所在的程序集-->
<object name="UserInfoDal" type="Spring.Net.EFUserInfoDal, Spring.Net">
<property name="Name" value="张三"/>
<!--ref指向下面的属性注入-->
<property name="UserInfo" ref="UserInfo"/>
</object> <!--构造函数注入-->
<object name="UserInfoDal2" type="Spring.Net.AdoNetUserInfoDal, Spring.Net">
<constructor-arg index="0" value="张三"/>
<constructor-arg index="1" ref="UserInfo"/>
</object> <!--属性注入-->
<object name="UserInfo" type="Spring.Net.UserInfo, Spring.Net">
<property name="Name" value="李四"/>
<property name="Age" value="15"/>
</object>
</objects>
</spring>
</configuration>

Program.cs

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; //Spring.Aop.dll 面向切面编程
//Spring.Core.dll spring框架基础
//Common.Logging.dll 这个必须也要引用 namespace Spring.Net
{
class Program
{
static void Main(string[] args)
{
//控制权没有反转
//IUserInfoDal infoDal = new EFUserInfoDal(); //Spring.Net 创建实例的方式转为容器帮我们创建
//第一步,引用Spring.Net程序集 Spring.Core.dll 和 Common.Logging.dll
//第二步,添加Spring.Net配置节点
//第三步,配置object节点
//第四步,创建spring容器上下文
IApplicationContext ctx = ContextRegistry.GetContext();
//第五步,通过容器创建对象
IUserInfoDal efDal = ctx.GetObject("UserInfoDal") as IUserInfoDal;
efDal.Show(); IUserInfoDal adoDal = ctx.GetObject("UserInfoDal2") as IUserInfoDal;
adoDal.Show(); Console.ReadKey();
}
}
}

下面是MVC项目中使用Spring.Net融合的例子

1、将Spring.net程序集复制到项目下的packages文件夹中。

2、项目中添加引用Spring.Core.dll、Common.Logging.dll、Spring.Web.Mvc4.dll、Spring.Web.dll

3、修改Web.config,配置节点

<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <!-- Spring.Net配置节点 -->
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc4"/>
</sectionGroup>
</configSections>
<!-- Spring.Net节点详细配置 -->
<spring>
<context>
<resource uri="file://~/Config/controllers.xml"/>
</context>
</spring> </configuration>

4、项目中创建Config文件夹,controllers.xml文件。

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"> <object type="HX.Shop.UI.Main.Controllers.AdminController, HX.Shop.UI.Main" singleton="false" >
<property name="AdminService" ref="AdminService" />
</object>
<object name="AdminService" type="HX.Shop.BLL.AdminService, HX.Shop.BLL" singleton="false" > </object>
</objects>

5、Global.asax 中修改 SpringMvcApplication

public class MvcApplication : Spring.Web.Mvc.SpringMvcApplication //System.Web.HttpApplication

Spring.Net---1、IOC第一个实例的更多相关文章

  1. Spring学习笔记IOC与AOP实例

    Spring框架核心由两部分组成: 第一部分是反向控制(IOC),也叫依赖注入(DI); 控制反转(依赖注入)的主要内容是指:只描述程序中对象的被创建方式但不显示的创建对象.在以XML语言描述的配置文 ...

  2. Spring FrameWork4(MVC + IOC)高速入门实例

    使用Maven创建project并配置依赖项 首先创建一个Maven Project: 然后选择创建Maven 的webapp实例,当然也能够通过命令行方式创建Maven webapp的项目再转化并导 ...

  3. Spring中IoC的入门实例

    Spring中IoC的入门实例 Spring的模块化是很强的,各个功能模块都是独立的,我们可以选择的使用.这一章先从Spring的IoC开始.所谓IoC就是一个用XML来定义生成对象的模式,我们看看如 ...

  4. Spring入门1. IoC入门实例

    Spring入门1. IoC入门实例 Reference:Java EE轻量级解决方案——S2SH 前言: 之前学习过关于Spring的一点知识,曾经因为配置出现问题,而总是被迫放弃学习这些框架技术, ...

  5. Spring源码-IOC部分-循环依赖-用实例证明去掉二级缓存会出现什么问题【7】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  6. Spring 简单使用IoC与DI——XML配置

    目录 Spring简介 导入jar包 Spring配置文件 Spring的IoC IoC简介 快速使用IoC Spring创建对象的三种方式 使用构造方法 使用实例工厂 使用静态静态工厂 Spring ...

  7. spring学习(一) ———— IOC讲解

    spring基本就两个核心内容,IOC和AOP.把这两个学会了基本上就会用了. --WH 一.什么是IOC? IOC:控制反转,通俗点讲,将对象的创建权交给spring,我们需要new对象,则由spr ...

  8. Spring的AOP配置文件和注解实例解析

    1.1           Spring的AOP配置文件和注解实例解析 AOP它利用一种称为"横切"的技术,将那些与核心业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减 ...

  9. Spring中的IOC

    在学习spring的时候,最常听到的词应该就是IOC和AOP了,以下,我从我的角度再次理解一下Spring里的IOC和AOP. IOC简单介绍 IoC(InversionofControl):IoC就 ...

随机推荐

  1. zTree第二章,各种常见setting设置和方法

    具体详见API文档: http://www.treejs.cn/v3/api.php --------------------------------------------------------- ...

  2. django rest framework 向数据库中插入数据时处理外键的方法

    一.models.py中 from django.db import models class UserModel(models.Model) user_name = models.CharField ...

  3. Qt5学习笔记(消息过滤器)

    T06EventFilter.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += widgets gui MyWidget.h #i ...

  4. 如何到python模块路径linux

    执行命令whereis python即可显示出python相关的所有的路径,包括可执行文件路径,安装路径等,该方法适用于大部分类似的场景抄自百度知道

  5. 某种带权有向无环图(graph)的所有路径的求法

    // 讨论QQ群:135202158 最近做某个东西,最后用图实现了,这里总结一下算法. 假设有以下带权有向无环图(连通或非连通,我这里用的是非连通的): 每个节点(node)可能与其他节点有向地相连 ...

  6. P1642 规划

    题目链接 题意分析 一看就知道是一道\(01\)分数规划的题 我们二分值之后 跑树形背包就可以了 CODE: #include<iostream> #include<cstdio&g ...

  7. InfluxDB概念和基本操作 二

    InfluxDB概念和基本操作   InfluxDB基本概念 数据格式 在 InfluxDB 中,我们可以粗略的将要存入的一条数据看作一个虚拟的 key 和其对应的 value(field value ...

  8. 分享:Android浏览器,用NDK C++做底层开发的Android浏览器,纯免费,无广告

    分享:用 NDK C++做底层开发的Android 浏览器,纯免费,无广告 分享:用 NDK C++做底层开发的Android 浏览器,纯免费,无广告 操作简单,傻瓜一看就会 无毒.无广告.无负作用, ...

  9. Qt Creator中使用qss对界面美化没有作用(效果)的问题

    最近在研究qt界面开发,发现使用qss对界面进行美化后效果不错,要比mfc效率高很多,美化效果也很出色.但是在使用qss文件对界面控件进行美化的过程中遇到了个很奇葩的问题,困惑了我好久,今晚又遇到了, ...

  10. oauth2.0的授权流程详解

    授权模式 1)oauth2.0 提供了四种授权模式,开发者可以根据自己的业务情况自由选择. 授权码授权模式(Authorization Code Grant) 隐式授权模式(简化模式)(Implici ...