1.认识spring.net

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

企业级应用一般由多个物理层组成,每个物理层也经常划分为若干功能层。不同层次之间需要相互协作,例如,业务服务层一般需要使用数据访问层的对象来实现某个用例。不管应用程序如何构建,最终都会表现为一系列相互协作的对象,这些对象一起组成了完整的应用程序。所以我们说,应用程序中的对象之间相互具有依赖性。

.NET平台为构建应用程序提供了丰富的功能,从非常基础的基元类型和基础类库(以及定义新类的方法),到功能完善的应用程序服务器和Web框架,都有很好的支持。但.NET平台本身并没有提供任何方式来管理基础的应用模块并将它们组合为一个相互协作的整体,只能依靠架构师或开发人员去创建(一系列)应用程序。诚然,目前有很多设计模式可用于业务系统的设计,我们可以使用这些模式将各种类或对象组合成能够正常工作的完整应用。工厂、抽象工厂、Builder、装饰及服务定位器(Service Locator)等模式已被现今的软件开发行业广泛接受和采用(这也许正是这些模式最早被定型为模式的原因)。这些模式都非常好,但也不过是些已命名的最佳编程方法,在对这些模式的介绍中一般还会说明它们是作什么用的、最好应用到什么场合、可以解决什么问题等等。我们可以从许多书籍和wiki上找到这些模式,然后仔细研读,然后实现在我们自己的应用中。

Spring.NET的IoC容器所解决的,正是如何在企业应用中将类、对象和服务组合成应用程序的问题。IoC容器通过很正统(按:formalized,言下之意是这些方式都是已经定型了的、经过了业界多年考验的)的方式将分散的组件组合成完整的应用程序。Spring.NET框架所采用的,都是被业界无数应用程序考验多年的、已经被定型为设计模式的最佳编程方式,实际上,这些模式已经成为我们架构和开发时的法典,而通过Spring.NET,我们可以直接将它们整合到自己的应用程序中。目前已有很多组织和机构用Spring框架开发出了强壮的、维护性好的应用程序,这确实是一件非常好的事情。

2.spring.net 组件功能说明

这里引用一篇博客的地址 http://blog.csdn.net/lee576/article/details/8621212 (已经写的很详细了)

(主要运用到两个dll)

Common.Logging.dll

Spring.Core.dll

3.学习从demo开始

demo环境是vs2013

创建新解决方案--》创建控制台应用程序(随便你创建什么,你做主)--》利用nuget 加载spring.net 包

项目:

如何使用nuget程序包 (http://springframework.net/

  • 在你的控制台项目上点击右键

这里,我选择的是 Spring.Web.MV4  ,直接点击安装就ok了。(安装后,在项目的文件下,多了packages文件夹,记着 ,把这个文件夹拷贝出来,以后,直接引用里面的dll文件就ok了,不需要使用NuGet)

接下来就开始实现

控制反转(工厂模式):

代码实现:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection.Emit;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using Spring.Context;
  8. using Spring.Context.Support;
  9.  
  10. namespace IOCTest
  11. {
  12. internal class Program
  13. {
  14. private static void Main(string[] args)
  15. {
  16. //创建容器对象
  17. IApplicationContext ctx = ContextRegistry.GetContext();
  18. IPerson p = (IPerson)ctx.GetObject("MyPerson");
  19.  
  20. p.SayHello();
  21. Console.ReadKey();
  22. }
  23.  
  24. }
  25. public interface IPerson
  26. {
  27. void SayHello();
  28. }
  29.  
  30. public class Person : IPerson
  31. {
  32. public string Name { get; set; }
  33. public int Id { get; set; }
  34. public Car MyCar { get; set; }
  35.  
  36. public Person()
  37. {
  38. Console.WriteLine("无参构造方法被调用");
  39. }
  40.  
  41. public Person(string name)
  42. {
  43. Console.WriteLine("string参构造方法被调用");
  44. Name = name;
  45. }
  46.  
  47. public Person(int id)
  48. {
  49. Console.WriteLine("int参构造方法被调用");
  50. Id = id;
  51. }
  52.  
  53. public Person(int id, string name)
  54. {
  55. Console.WriteLine("int+string参构造方法被调用");
  56. Name = name;
  57. Id = id;
  58. }
  59.  
  60. public void SayHello()
  61. {
  62. Console.WriteLine(Name+" : Say Hello "+MyCar.Brand);
  63. }
  64. }
  65.  
  66. public class Car
  67. {
  68. public string Brand { get; set; }
  69. }
  70.  
  71. }

App.config:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.  
  4. <configSections>
  5. <sectionGroup name="spring">
  6. <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
  7. <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
  8. </sectionGroup>
  9. </configSections>
  10.  
  11. <startup>
  12. <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  13. </startup>
  14.  
  15. <spring>
  16. <context>
  17. <resource uri="config://spring/objects"/>
  18. </context>
  19. <objects xmlns="http://www.springframework.net">
  20. <description>An example that demonstrates simple IoC features.</description>
  21. <!--name:object的名称 ,type:'关于类型的完全限定名(命名空间+类名),类的程序集名称(命名空间)'-->
  22. <object name="MyPerson" type="IOCTest.Person,IOCTest">
  23. <!--<property name="Brand" value="Audi"/>-->
  24. <!--constructor 定义构造方法 index :参数索引,value:参数值 调用还有一个参数的构造函数-->
  25. <!--<constructor-arg index="" value=""/>-->
  26. <!--name: 构造方法的形参 value 是实参-->
  27. <!--<constructor-arg name="id" value=""/>-->
  28. <!--<constructor-arg value="yzhou"/>-->
  29. <!--type:构造函数形参的类型-->
  30. <!--<constructor-arg type="string" value=""/>-->
  31.  
  32. <constructor-arg index="" value=""/>
  33. <constructor-arg index="" value="yzhou"/>
  34. <!--属性的依赖注入-->
  35. <property name="Name" value="yzhou1111"/>
  36. <property name="MyCar" ref="Car1"/>
  37. </object>
  38.  
  39. <object name="Car1" type="IOCTest.Car,IOCTest">
  40. <property name="Brand" value="Audi"/>
  41. </object>
  42. </objects>
  43. </spring>
  44.  
  45. </configuration>

暂时不看配置文件中的spring节点

步骤:

先添加 configSections

  1. <configSections>
  2. <sectionGroup name="spring">
  3. <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
  4. <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
  5. </sectionGroup>
  6. </configSections>

注意:要将 configSections 节点 必须是 configuration节点的第一个子节点

不然会报错“配置系统未能初始化”

再添加spring节点

  1. <spring>
  2. <context>
  3. <resource uri="config://spring/objects"/>
  4. </context>
  5. <objects xmlns="http://www.springframework.net">
  6. <description>An example that demonstrates simple IoC features.</description>
  7.  
  8. </objects>
  9. </spring>

简单来说,一个类在spring节点中对应的是一个object,

形式:

  1. <objects>
  2. <object name="名称随便起,不过这个表示的需要实例化类的番号" type=“(类的完全限定名 命名空间+类名),(类的程序集名称 一般指命名空间,因为程序集的名称是可以修改的)”></object>
  3. </objects>

依赖注入:(构造方法+属性)、

  • 构造方法:(关键字 constructor-arg)  注意 每个object里面constructor-arg的个数,表示有几个形参的构造函数

多种形式:

<constructor-arg index="0" value="10"/> :表示 还有一个参数的构造函数,以类中构造函数的上下排序的。若有两个还有1个参数的构造函数,那么哪个在上就用谁;

<constructor-arg index="0" value="10"/>
<constructor-arg index="1" value="zhangsan"/>  : 表示两个参数的构造函数。;

<constructor-arg name="id" value="10"/>: name的值代表构造函数中形参的字符;

<constructor-arg  type="string" value="10"/>: type表示构造函数中形参的类型,来区分

  • 属性:(关键字 property)

<property name="Name" value="yzhou1111"/>         Name 表示,类中属性字段

<property name="MyCar" ref="Car1"/>    注意ref 的使用,在Person类中,定义了 Car类当作属性字段,所以就用ref

spring.net 在demo中的分析的更多相关文章

  1. [Spring Boot] Spring Boot启动过程源码分析

    关于Spring Boot,已经有很多介绍其如何使用的文章了,本文从源代码(基于Spring-boot 1.5.6)的角度来看看Spring Boot的启动过程到底是怎么样的,为何以往纷繁复杂的配置到 ...

  2. Spring Boot启动过程源码分析--转

    https://blog.csdn.net/dm_vincent/article/details/76735888 关于Spring Boot,已经有很多介绍其如何使用的文章了,本文从源代码(基于Sp ...

  3. Spring Cloud 学习 之 Spring Cloud Eureka(源码分析)

    Spring Cloud 学习 之 Spring Cloud Eureka(源码分析) Spring Boot版本:2.1.4.RELEASE Spring Cloud版本:Greenwich.SR1 ...

  4. Spring的简单demo

    ---------------------------------------- 开发一个Spring的简单Demo,具体的步骤如下: 1.构造一个maven项目 2.在maven项目的pom.xml ...

  5. Spring与Hibernate集成中的Session问题

    主要讨论Spring与Hibernate集成中的session问题 1.通过getSession()方法获得session进行操作 public class Test extends Hibernat ...

  6. Spring Security OAuth2 Demo -- good

    1. 添加依赖授权服务是基于Spring Security的,因此需要在项目中引入两个依赖: <dependency> <groupId>org.springframework ...

  7. Spring加载流程源码分析03【refresh】

      前面两篇文章分析了super(this)和setConfigLocations(configLocations)的源代码,本文来分析下refresh的源码, Spring加载流程源码分析01[su ...

  8. Spring Cloud Data Flow 中的 ETL

    Spring Cloud Data Flow 中的 ETL 影宸风洛 程序猿DD 今天 来源:SpringForAll社区 1 概述 Spring Cloud Data Flow是一个用于构建实时数据 ...

  9. spring boot 2.0 源码分析(一)

    在学习spring boot 2.0源码之前,我们先利用spring initializr快速地创建一个基本的简单的示例: 1.先从创建示例中的main函数开始读起: package com.exam ...

随机推荐

  1. windows下codeblocks报错undefined reference to `WSAStartup@8'|

    Windows下C++Socket编程,调用WSAStartup函数报错:undefined reference to `WSAStartup@8'| 本人使用的是Codeblocks MinGW M ...

  2. RDLC - 后台代码直接导出Excel/PDF/Word格式

    最近做报表功能,用到了.net的报表组件rdlc. 其中有个功能就是后台代码直接输出Excel/PDF/Word格式的文件,网上看了些资源,做个总结: 参考地址 我直接贴出代码: //自动导出exce ...

  3. 作为一名前端开发工程师,你必须掌握的WEB模板引擎:Handlebars

    作为一名前端开发工程师,你必须掌握的WEB模板引擎:Handlebars 一.为什么需要使用模板引擎? 关于为什么要使用模板引擎,按照我常对学生说的一句话就是:不用重复造轮子..   简单来说,模板最 ...

  4. document的属性与方法小结

    document节点是文档的根节点,每张网页都有自己的document节点.属性:1:document.doctype----它是一个对象,包含了当前文档类型 (Document Type Decla ...

  5. vue_使用npm搭建vue2.0脚手架开发环境

    前言: 在使用vue进行开发时需要搭建vue的运行环境,这里主要是使用淘宝镜像cnpm进行搭建vue的脚手架开发环境.主要是分为mac和window两个版本,两个环境的搭建都是大同小异. mac开发环 ...

  6. select下拉箭头改变,兼容ie8/9

    各个浏览器下select默认的下拉箭头差别较大,通常会清除默认样式,重新设计 <html> <head> <meta charset="utf-8"& ...

  7. ERROR 1682 (HY000)

    ERROR 1682 (HY000) xtrabackup 恢复数据库后,出现1682错: root@localhost [(none)]>show global variables like ...

  8. glob模块的使用

    glob模块 功能描述:glob模块可以使用Unix shell风格的通配符匹配符合特定格式的文件和文件夹,跟windows的文件搜索功能差不多.glob模块并非调用一个子shell实现搜索功能,而是 ...

  9. MS SQLServer 批量附加数据库

    /************************************************************ * 标题:MS SQLServer 批量附加数据库 * 说明:请根据下面的注 ...

  10. iOS 适配/ autoLayout基本知识

    历史 iPhone3GS.iPhone4\4s:没有屏幕适配最早开发里面的程序全部都是写死的 iPad 旋转出来之后 Autoresizing问世iPhone5\5c\5s兼容各种不同的情况 系统适配 ...