热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Spring.Net框架介绍及基本配置(学习笔记一)

Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序。它提供了很多方面的功能,比如依赖注入、面向方面编程(AOP)、数据访问抽象及ASP.NET扩展等等。Spr

  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、属性注入

    
            

  2、构造注入

            
           

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

全部配置文件如下:

  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
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
{
public class 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
{
public class Bar
{
public string Heigth { get ; set ; }
}
}

namespace ConsoleAppSpring
{
public class Baz
{
// public List Name { get; set; }
public string Name { get ; set ; }
}
}

namespace ConsoleAppSpring
{
public class MethodInjection
{
public string Name { get ; set ; }
public int Age { get ; set ; }

public MethodInjection()
{

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

namespace ConsoleAppSpring
{
public class InjectionFactory
{
public string name = " method injection " ;
public int age = 32 ;

public virtual object GetObject()
{
return new MethodInjection(name, age);
}
}
}

 4、使用以上Spring的配置

  

代码
1 static void 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

附:源码下载


推荐阅读
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
author-avatar
马宝宝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有