zoukankan      html  css  js  c++  java
  • Spring.Net框架介绍及基本配置(学习笔记一)

      Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序。它提供了很多方面的功能,比如依赖注入、面向方面编程(AOP)、数据访问抽象及ASP.NET扩展等等。Spring.NET以Java版的Spring框架为基础,将Spring.Java的核心概念与思想移植到了.NET平台上。  

      Spring作为实现IOC或者说是DI的一种框架,为我们更好的降低程序的耦合性提供了一种方便的处理方式。当然也有其他一些实现IOC的框架如微软的Unity。至于何谓IOC、DI我这里也就不介绍了。有兴趣可以参考http://student.csdn.net/space.php?uid=706796&do=blog&id=39000

      首先声明,我写这个系列并不是因为自己很精通。只是自己的一个学习过程。如果有什么不对的地方,往专家踊跃拍砖!

      本节要点:

      1、Spring整体框架介绍

      2、Spring基本配置

      3、Spring注入方式

      4、配置的使用

      首先:我使用的Spring的版本为:Spring1.3。开发工具为:VS2008

      学习Spring,首先得学会如何配置它。可以从官网下载最新的安装包www.springframework.net.

      1、Spring的整体框架以及说明

      

      

      Spring.Core作为整个框架的基础,实现了依赖注入的功能。Spring.NET的大部分模块都要依赖或扩展该模块。Spring.Core的基础是IObjectFactory接口,该接口用一个简单而优雅的方式实现了工厂模式,使我们可以无需自行编写singleton类型和众多的服务定位器,并允许将对象配置及其依赖关系与具体的程序逻辑解耦。该模块中的IApplicationContext接口是IObjectFactory的扩展,增加了诸多企业级功能,包括使用资源文件进行文本本地化、事件传播和资源装载等等。

      Spring.AOP为业务对象提供面向方面编程(AOP)的支持。AOP完善了IoC容器的功能,为创建企业应用和使用声明式服务奠定了坚实的基础。

      Spring.Web对ASP.NET进行了一系列功能扩展,包括对ASP.NET页面进行依赖注入、双向数据绑定、在ASP.NET 1.1中使用Master page、以及增强的本地化功能支持等。

      Spring.Services允许将任意的“普通”对象(意为没有继承任何指定基类型的对象)发布为企业服务(COM+)或远程对象。通过依赖注入和特性元数据覆盖等功能,该模块可使.NET的Web服务获得极大的灵活性。同时也支持Windows后台服务。

    Spring.Data定义了一个抽象的数据访问层,可以跨越各种数据访问技术(从ADO.NET到各种ORM)进行数据访问。该模块包含一个ADO.NET的抽象层,减少了使用传统ADO.NET进行编码和事务管理时的工作量。

    Spring.ORM为时下流行的ORM类库提供了一个整合层,其中包含声明式事务管理等诸多功能。

      2、Spring基本配置:

      Spring的配置比起NHibernate算是比较简单了(个人意见)。同NHibernate一样,它的配置文件也是用XML完成的。如果你想在手工书写Spring配置文件时,有同NHibernate配置的智能感应一样,那你需要将Spring安装目录下(Spring.NET 1.3.0\doc\schema)的XML结构文件拷贝到VS的安装目录的架构文件中如:C:\Program Files\Microsoft Visual Studio 9.0\Xml\Schemas。

      Spring的配置中有几个是必须的,并且在不同的应用中都一样。如:

    代码
    1 <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
    2  <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/>
    3
    4  <spring>
    5    <context>
    6   <resource uri="config://spring/objects"/>
    7 </context>
    8    <objects xmlns="http://www.springframework.net" xmlns:aop="http://www.springframework.net/aop"></objects>
    9  </spring>

            其中,name属性以及其类型都是固定配置,不可更改。context节点、objects也一样。

      其他的便是根据具体应用所进行的配置。

    3、注入方式:

      1、属性注入

        <property name="baz" ref="baz" ></property>
                 <property name="bar" ref="bar"></property>

      2、构造注入

                 <constructor-arg name="_bar"  ref="bar"></constructor-arg>
                <constructor-arg name="_baz"  ref="baz"></constructor-arg>

    以上两种配置根据类的有无属性、构造函数进行。不过在其他资料中,别人说属性注入的方式比较常用。

    全部配置文件如下:

      3、方法注入。

      通过其他类的方法来构造对象。配置如下:

    代码
    1 <object id="objFactory" type="ConsoleAppSpring.InjectionFactory,ConsoleAppSpring">
    2 <lookup-method name="GetObject"object="target"/>
    3 </object>
    4
    5 <object id="target" type ="ConsoleAppSpring.MethodInjection,ConsoleAppSpring" singleton="1">
    6 <property name="Name" value="TestName"></property>
    7 <property name="Age" value="38"></property>
    8 </object>

    注意:通过属性注入时:类必须有无参数构造函数,否则会发生如下异常。通过构造注入时:可以无无参数构造函数,但是,构造属性

    constructor-arg 的name属性值应为对应构造函数的参数

          以上注入方式配置文件如下:

    代码
    1 <?xml version="1.0" encoding="utf-8"?>
    2  <configuration>
    3 <configSections>
    4 <sectionGroup name="spring">
    5 <section name="context" type="Spring.Context.Support.ContextHandler,Spring.Core"/>
    6 <section name="objects" type="Spring.Context.Support.DefaultSectionHandler,Spring.Core"/>
    7 </sectionGroup>
    8 </configSections>
    9
    10
    11 <spring>
    12 <context>
    13 <resource uri="config://spring/objects"/>
    14 </context>
    15
    16 <objects xmlns="http://www.springframework.net" xmlns:aop="http://www.springframework.net/aop">
    17 <object id="foo" type="ConsoleAppSpring.Foo,ConsoleAppSpring">
    18 <property name="baz"ref="baz"></property>
    19 <property name="bar"ref="bar"></property>
    20 <!--<constructor-arg name="_bar"ref="bar"></constructor-arg>
    21 <constructor-arg name="_baz"ref="baz"></constructor-arg>-->
    22 </object>
    23
    24 <object id="bar" type="ConsoleAppSpring.Bar,ConsoleAppSpring">
    25 <property name="Heigth" value="27"></property>
    26 </object>
    27 <object id="baz" type="ConsoleAppSpring.Baz,ConsoleAppSpring">
    28 <property name ="Name">
    29 <value>tyb</value>
    30 </property>
    31 </object>
    32
    33 <object id="objFactory" type="ConsoleAppSpring.InjectionFactory,ConsoleAppSpring">
    34 <lookup-method name="GetObject"object="target"/>
    35 </object>
    36
    37 <object id="target" type ="ConsoleAppSpring.MethodInjection,ConsoleAppSpring" singleton="1">
    38 <property name="Name" value="TestName"></property>
    39 <property name="Age" value="38"></property>
    40 </object>
    41
    42
    43 </objects>
    44 </spring>
    45  </configuration>

       在Objects节点的子节点Object中,ID代表类的标识,type代表类的具体类型。具体Foo、Bar、Baz三个类的代码一起给出:

    代码
    namespace ConsoleAppSpring
    {
    publicclass Foo
    {
    public Bar bar { get; set; }
    public Baz baz { get; set; }

    public Foo()
    { }

    public Foo(Bar _bar, Baz _baz)
    {
    bar
    = _bar;
    baz
    = _baz;


    }
    }
    }

    namespace ConsoleAppSpring
    {
    publicclass Bar
    {
    publicstring Heigth { get; set; }
    }
    }

    namespace ConsoleAppSpring
    {
    publicclass Baz
    {
    //public List<string> Name { get; set; }
    publicstring Name { get; set; }
    }
    }

    namespace ConsoleAppSpring
    {
    publicclass MethodInjection
    {
    publicstring Name { get; set; }
    publicint Age { get; set; }

    public MethodInjection()
    {

    }
    public MethodInjection(string name, int age)
    {
    Name
    = name;
    Age
    = age;
    }
    }
    }

    namespace ConsoleAppSpring
    {
    publicclass InjectionFactory
    {
    publicstring name ="method injection";
    publicint age =32;

    publicvirtualobject GetObject()
    {
    returnnew MethodInjection(name, age);
    }
    }
    }

     4、使用以上Spring的配置

      

    代码
    1 staticvoid Main(string[] args)
    2 {
    3 IApplicationContext context = ContextRegistry.GetContext();
    4 Foo foo = (Foo)context.GetObject("foo");
    5 Console.WriteLine(foo.bar.Heigth);
    6 Console.WriteLine(foo.baz.Name);
    7
    8 InjectionFactory factory = (InjectionFactory)context.GetObject("objFactory");
    9 Console.WriteLine("factory name is"+ factory.name +"factory age is "+ factory.age);
    10 MethodInjection injection = (MethodInjection)factory.GetObject();
    11 Console.WriteLine("methodinjection name is {0}, age is {1}:" , injection.Name, injection.Age);
    12 Console.ReadLine();
    13
    14 }

      

    输出如下:

    由上图可以看出MethodInjection的属性还是配置文件给出的值,不会因为InjectionFactory而改变

    说明:IApplicationContext 、ContextRegistry需要引入 Spring.Context、 Spring.Context.Support命名空间。安装完Spring后,在安装的目录中能找到相应的程序集。IObjectFactory接口提供了配置框架和基本功能,IApplicationContext接口又在其基础上扩展了许多企业级特性。可以说IApplicationContext是IObjectFactory的一个超集,具备IObjectFactory所有的功能与行为。ContextRegistry类既可用来初始化应用程序上下文,也可用来以服务定位器风格对容器中的对象进行访问

    参考:Spring.Net框架参考文档
         http://www.cnblogs.com/goodHelper

    附:源码下载

  • 相关阅读:
    JavaScipt面向对象编程----闭包
    vmWare虚拟机下ubuntu配置代理上网
    SimpleDateFormat使用具体解释
    同类型结构体之间赋值不一定有效
    EJB究竟是什么,真的那么神奇吗??
    Python学习笔记12:标准库之对象序列化(pickle包,cPickle包)
    android 视频通话开启呼叫等待后,来第三方的视频通话,接通后通话时间一直显示为0,过几秒之后视频通话自己主动挂断
    [Apache Spark源代码阅读]天堂之门——SparkContext解析
    【Linux】linux经常使用基本命令
    白话经典算法系列之中的一个 冒泡排序的三种实现
  • 原文地址:https://www.cnblogs.com/tyb1222/p/1877514.html
Copyright © 2011-2022 走看看