我在上一篇关于Spring.net的文章“Spring.NET框架简介及模块说明 ”中很详细的介绍了,本文就不旧话从提。我门就直奔主题吧。

1.首先了解两个接口.
  IObjectFactory接口和IApplicationContext接口:他两个称为“容器”或“IOC容器”。

Spring.net框架的核心原则是非侵入性。
  IObjectFactory接口是初始化、配置及管理对象的实际容器。
  IObjectFactory全限定名为Spring.Objects.Factory.IObjectFactory,IObjectFactory接口有多个实现,其中最
  常用的是Spring.Objects.Factory.XML.XmlObjectFactory。

2.对象定义的XML文件
  在app.config或是web.config中加入
  <spring>
    <context type="Spring.Context.Support.XmlAppliationContext",Spring.Core"/>
    <resource uri=file://objects.xml//>
  </spring>
  注意:context的type属性是可以省略的。

3.spring和context的顺序是有限制的,在Spring.net框架里已经将“spring/context”作为字符串常量定义在了
  AbstractApplicationContext类中以来表示上下文的接点名称。可通过:
  IApplicationContext context=ContextRegistry.GetContext();来获取接点值,这里要注意一点。在使用他的
  时候必须要使配置文件中的<spring>接点起作用,这样就得必须在.NET的配置文件<configSections>节点下注册类
  Spring.Context.Support.ContextHandler,它让ContextRegistry类可用来初始化应用程序上下文,它实现在FCL
  的IConfigurationSectionHandler接口

3.XML对象定义可在<objects>节点注册
  <section name="objects" type="Spring.Context.Support.DefultSectionHandler,Spring.Core">
 
4.Spring.net的IOC容器的简单实例----用简单三层来实现
  光说这么多没用,我门还是来点实际的,看看下面的这个简单实例:
  一.先建立项目随后添加引用Spring.Core程序集。
  二.引用System.Configuration----需要用到ConfigurationManager类的方法。
  三.配置.NET配置文件----具体配置如下:
  <?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>
        <!--这的配置根据实际的程序来的,UsersCompontents是程序集Spring.Demo.Compontext下的一个类-->
        <object name="Users"       
                type="Spring.Demo.Compontext.UsersCompontents,Spring.Demo.Compontent">
        </object>
      </objects>
    </spring>
  </configuration>
  四.建立好项目的实体类和接口以及实现借口。
  下面是实例程序的结构图:Model(实体层),Service(接口),Compontent(实现接口的业务逻辑),SimpleTest(测试)
    
   五.首先看看实体层的定义,我相信代码大家都看得懂就不多说了,直接贴上来。
   using System;
   using System.Collections.Generic;
   using System.Text;

namespace Spring.Demo.Model
   {
    /// <summary>
    /// 用户类
    /// </summary>
    public class Users
    {
        /// <summary>
        /// 编号
        /// </summary>
        private int _oid;
        public int Oid
        {
            get { return _oid; }
            set { _oid = value; }
        }

/// <summary>
        /// 姓名
        /// </summary>
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

/// <summary>
        /// 性别
        /// </summary>
        private string _sex;
        public string Sex
        {
            get { return _sex; }
            set { _sex = value; }
        }

/// <summary>
        /// 年龄
        /// </summary>
        private int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }
      }
   }

六.在看接口的定义
     using System;
     using System.Collections.Generic;
     using System.Text;
     namespace Spring.Demo.Service
     {
        public interface IUsers
        {
           /// <summary>
           /// 返回用户的详细信息的方法
           /// </summary>
           /// <returns></returns>
           string GetUserInfo();
       }
    }
   七.实现接口方法的逻辑
     using System;
     using System.Collections.Generic;
     using System.Text;
     using Spring.Demo.Service;
     using Spring.Demo.Model;

namespace Spring.Demo.Compontext
     {
        public class UsersCompontents:IUsers
        {
           public UsersCompontents()
           { }

#region 获取用户信息
           public string GetUserInfo()
           {
              Users user = new Users();
              user.Oid = 1;
              user.Name = "Beniao";
              user.Sex = "Boy";
              user.Age = 25;

return string.Format("编号:{0}--->姓名:{1}--->性别:{2}--->年龄:{3}",
                  user.Oid,
                  user.Name,
                  user.Sex,
                  user.Age);
          }
          #endregion
       }
    }
    八.通过Spring.net的IOC容器IApplicationContext从config文件中取得程序集信息和调用方法实现控制反转
     //从config文件中取得程序集信息
     IApplicationContext context =  ConfigurationManager.GetSection("spring/context") 
                                    as IApplicationContext;
    //调用方法
    //Users为config文件里的配置节
    //<object name="Users"       
    //        type="Spring.Demo.Compontext.UsersCompontents,Spring.Demo.Compontent">
    //</object>
    IUsers user = context.GetObject("Users") as IUsers;
    Console.WriteLine(user.GetUserInfo());
    Console.Read();
    运行结果如下:
    

关于Spring.net的IOC容器就简单介绍在这里了,我也是刚学Spring.net,文章里难免会出现错误,目前
    Spring.net的人气太低了,希望对这有兴趣的朋友多多探讨,更希望这方面的高手能多指教。如文章中发现
    错误希望大家留言提出,我门大家一起学习,改进。

 本文示例程序下载:Spring.Demo.rar

Spring.net(二)----初探IOC容器的更多相关文章

  1. Spring系列二:IoC 容器

    还君明珠双泪垂,恨不相逢未嫁时. 概述 Spring IoC容器是Spring框架的核心.只需要进行简单的容器配置,就可以将创建对象,使用对象,销毁对象联系在一起,从而管理从创建对象到销毁对象的整个生 ...

  2. spring之:XmlWebApplicationContext作为Spring Web应用的IoC容器,实例化和加载Bean的过程

    它既是 DispatcherServlet 的 (WebApplicationContext)默认策略,又是 ContextLoaderListener 创建 root WebApplicationC ...

  3. Spring(二)——IOC

    一.入门 1.案例 1 public class Student { 2 3 private String name; 4 5 public Student() { 6 System.out.prin ...

  4. Spring源码解析-ioc容器的设计

    Spring源码解析-ioc容器的设计 1 IoC容器系列的设计:BeanFactory和ApplicatioContext 在Spring容器中,主要分为两个主要的容器系列,一个是实现BeanFac ...

  5. Spring核心原理之IoC容器初体验(2)

    本文节选自<Spring 5核心原理> 1 IoC与DI基本概念 IoC(Inversion of Control,控制反转)就是把原来代码里需要实现的对象创建.依赖,反转给容器来帮忙实现 ...

  6. Spring系列14:IoC容器的扩展点

    Spring系列14:IoC容器的扩展点 回顾 知识需要成体系地学习,本系列文章前后有关联,建议按照顺序阅读.上一篇我们详细介绍了Spring Bean的生命周期和丰富的扩展点,没有阅读的强烈建议先阅 ...

  7. Spring源码解析二:IOC容器初始化过程详解

    IOC容器初始化分为三个步骤,分别是: 1.Resource定位,即BeanDefinition的资源定位. 2.BeanDefinition的载入 3.向IOC容器注册BeanDefinition ...

  8. Spring 学习笔记(二)—— IOC 容器(BeanFactory)

    使用Spring IoC容器后,容器会自动对被管理对象进行初始化并完成对象之间的依赖关系的维护,在被管理对象中无须调用Spring的API. 为了实现IoC功能,Spring提供了两个访问接口: or ...

  9. Spring 源码剖析IOC容器(一)概览

    目录 一.容器概述 二.核心类源码解读 三.模拟容器获取Bean ======================= 一.容器概述 spring IOC控制反转,又称为DI依赖注入:大体是先初始化bean ...

随机推荐

  1. go语言之进阶篇结构体指针类型匿名字段

    1.结构体指针类型匿名字段 示例: package main import "fmt" type Person struct { name string //名字 sex byte ...

  2. 百度编辑器ueditor通过ajax方式提交,不需要事先转义字符的方法(异常:从客户端(xxx)中检测到有潜在危险的 Request.Form 值)

    最近项目中使用百度编辑神器ueditor,确实是很好用的一款编辑器.官网教程提供的与后端数据交互都是跟表单方式有关的,项目中使用的是ajax方式提交,因此出现了不少问题,现在记录备忘下. 环境:.ne ...

  3. angular之interceptors拦截器

    <!DOCTYPE html> <html ng-app="nickApp"> <head> <meta charset="UT ...

  4. vue-cli项目优化,缩短首屏加载时间

    1.大文件定位 我们可以使用webpack可视化插件Webpack Bundle Analyzer 查看工程js文件大小,然后有目的的解决过大的js文件. 安装:npm install --save- ...

  5. Tomcat7出现HTTP Status 500 - java.lang.ClassCastException: org.apache.jasper.el.ELContextImpl cannot be cast to org.apache.jasper.el.ELContextImpl的解决

    今天在Tomcat7上发布了一个war,过一阵子发现localhost:8080都进不去了.在浏览器输入http://localhost:8080出现如下内容: HTTP Status 500 - j ...

  6. Python访问PostGIS(建表、空间索引、分区表)

    #encoding: utf-8 __author__ = 'Administrator' import psycopg2 import ppygis import datetime import s ...

  7. Discuz常见小问题-如何修改导航栏

    1 比如我要修改第一个导航栏,则在界面-导航设置,主导航,然后点击右边的编辑按钮 2 比如我把"首页"的名字改成"论坛首页",别的都不改,然后点击提交,刷新页面 ...

  8. 高德地图引入库错误std::string::find_first_of(char const*, unsigned long, unsigned long) const"

    一:std:编译器错误解决 二:错误提示 "std::string::find_first_of(char const*, unsigned long, unsigned long) con ...

  9. android 随手记 读写文件的几种方式

    java中多种方式读文件 一.多种方式读文件内容. 1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内容 4.随机读取文件内容 */ import java.io.BufferedRe ...

  10. UVA 10700 Camel trading 无括号的表达式 贪心

    题意:给出只包含数字和+*的表达式,你可以自己安排每一个运算的顺序,让你找出表达式可能得到的最大值和最小值. 很明显,先乘后加是最小值,先加后乘能得到最大值. 其实不是很明显... 证明下: 数字的范 ...