spring.net 在demo中的分析
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)
接下来就开始实现
控制反转(工厂模式):

代码实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Emit;
using System.Text;
using System.Threading.Tasks;
using Spring.Context;
using Spring.Context.Support; namespace IOCTest
{
internal class Program
{
private static void Main(string[] args)
{
//创建容器对象
IApplicationContext ctx = ContextRegistry.GetContext();
IPerson p = (IPerson)ctx.GetObject("MyPerson"); p.SayHello();
Console.ReadKey();
} }
public interface IPerson
{
void SayHello();
} public class Person : IPerson
{
public string Name { get; set; }
public int Id { get; set; }
public Car MyCar { get; set; } public Person()
{
Console.WriteLine("无参构造方法被调用");
} public Person(string name)
{
Console.WriteLine("string参构造方法被调用");
Name = name;
} public Person(int id)
{
Console.WriteLine("int参构造方法被调用");
Id = id;
} public Person(int id, string name)
{
Console.WriteLine("int+string参构造方法被调用");
Name = name;
Id = id;
} public void SayHello()
{
Console.WriteLine(Name+" : Say Hello "+MyCar.Brand);
}
} public class Car
{
public string Brand { get; set; }
} }
App.config:
<?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> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup> <spring>
<context>
<resource uri="config://spring/objects"/>
</context>
<objects xmlns="http://www.springframework.net">
<description>An example that demonstrates simple IoC features.</description>
<!--name:object的名称 ,type:'关于类型的完全限定名(命名空间+类名),类的程序集名称(命名空间)'-->
<object name="MyPerson" type="IOCTest.Person,IOCTest">
<!--<property name="Brand" value="Audi"/>-->
<!--constructor 定义构造方法 index :参数索引,value:参数值 调用还有一个参数的构造函数-->
<!--<constructor-arg index="" value=""/>-->
<!--name: 构造方法的形参 value 是实参-->
<!--<constructor-arg name="id" value=""/>-->
<!--<constructor-arg value="yzhou"/>-->
<!--type:构造函数形参的类型-->
<!--<constructor-arg type="string" value=""/>--> <constructor-arg index="" value=""/>
<constructor-arg index="" value="yzhou"/>
<!--属性的依赖注入-->
<property name="Name" value="yzhou1111"/>
<property name="MyCar" ref="Car1"/>
</object> <object name="Car1" type="IOCTest.Car,IOCTest">
<property name="Brand" value="Audi"/>
</object>
</objects>
</spring> </configuration>
暂时不看配置文件中的spring节点
步骤:
先添加 configSections
<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>
注意:要将 configSections 节点 必须是 configuration节点的第一个子节点
不然会报错“配置系统未能初始化”

再添加spring节点
<spring>
<context>
<resource uri="config://spring/objects"/>
</context>
<objects xmlns="http://www.springframework.net">
<description>An example that demonstrates simple IoC features.</description> </objects>
</spring>
简单来说,一个类在spring节点中对应的是一个object,
形式:
<objects>
<object name="名称随便起,不过这个表示的需要实例化类的番号" type=“(类的完全限定名 命名空间+类名),(类的程序集名称 一般指命名空间,因为程序集的名称是可以修改的)”></object>
</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中的分析的更多相关文章
- [Spring Boot] Spring Boot启动过程源码分析
关于Spring Boot,已经有很多介绍其如何使用的文章了,本文从源代码(基于Spring-boot 1.5.6)的角度来看看Spring Boot的启动过程到底是怎么样的,为何以往纷繁复杂的配置到 ...
- Spring Boot启动过程源码分析--转
https://blog.csdn.net/dm_vincent/article/details/76735888 关于Spring Boot,已经有很多介绍其如何使用的文章了,本文从源代码(基于Sp ...
- Spring Cloud 学习 之 Spring Cloud Eureka(源码分析)
Spring Cloud 学习 之 Spring Cloud Eureka(源码分析) Spring Boot版本:2.1.4.RELEASE Spring Cloud版本:Greenwich.SR1 ...
- Spring的简单demo
---------------------------------------- 开发一个Spring的简单Demo,具体的步骤如下: 1.构造一个maven项目 2.在maven项目的pom.xml ...
- Spring与Hibernate集成中的Session问题
主要讨论Spring与Hibernate集成中的session问题 1.通过getSession()方法获得session进行操作 public class Test extends Hibernat ...
- Spring Security OAuth2 Demo -- good
1. 添加依赖授权服务是基于Spring Security的,因此需要在项目中引入两个依赖: <dependency> <groupId>org.springframework ...
- Spring加载流程源码分析03【refresh】
前面两篇文章分析了super(this)和setConfigLocations(configLocations)的源代码,本文来分析下refresh的源码, Spring加载流程源码分析01[su ...
- Spring Cloud Data Flow 中的 ETL
Spring Cloud Data Flow 中的 ETL 影宸风洛 程序猿DD 今天 来源:SpringForAll社区 1 概述 Spring Cloud Data Flow是一个用于构建实时数据 ...
- spring boot 2.0 源码分析(一)
在学习spring boot 2.0源码之前,我们先利用spring initializr快速地创建一个基本的简单的示例: 1.先从创建示例中的main函数开始读起: package com.exam ...
随机推荐
- ASP.NET创建三层架构图解详细教程
1.新建项目 2.创建Visual Studio解决方案 3.再创建项目 4.选择类库类型 5.依次创建bll(业务逻辑层),dal(数据访问层)和model(模型层也可以叫实体层) 6.添加一个网站 ...
- jquery动画切换引擎插件 Velocity.js 学习02
案例实践: 第一页会以动画形式进入页面: 点击进入按钮时,第一页以动画消失,第二页以动画形式进入,同时四张图片也定义从小到大的动画形式: 第二页关闭按钮点击时,先是四张图片以缩小动画消失,然后第二页以 ...
- 普通用户加sudo权限
没配置之前希望在普通用户下,通过sudo命令,让用户暂时拥有root权限,并创建一个文件夹.很明显,失败了,错误原因是:该用户暂没有root权限. 解决办法如下 1.打开sudoers文件 切换到r ...
- 如何生成Java Key以及sign一个jar
1. 生成Java Key: keytool -genkey -alias mydomain -keyalg RSA -keystore keystore.jks -keysize mydomain ...
- 01背包入门 dp
题目引入: 有n个重量和价值分别为Wi,Vi的物品.从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中的价值总和的最大值. 分析: 首先,我们用最普通的方法,针对每个物品是否放入背包进行搜索. ...
- bzoj 2321 数学
首先我们假设两个点(i,j),(i,k)向中间移动一格,且k>j+1,那么我们可以获得的价值为k-j,这样,我们定义每个点的每个星的能量为a[(i,j)]=i*i+j*j,这样这两个点开始的能量 ...
- Android控件——ToggleButton多状态按钮(实现灯泡的开关)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAxoAAAFxCAIAAAB7jkm1AAAgAElEQVR4nOy9eXgUVb7/Dy7j3BnH8T
- c语言中的size_t
size_t unsigned int 类型,无符号,它的取值没有负数.用来表示 参数/数组元素个数,sizeof 返回值,或 str相关函数返回的 size 或 长度.sizeof 操作符的结果类型 ...
- Linux信号函数
1. signal函数: #include <signal.h> void (*signal(int signo, void (*func)(int)))(int); ret-成功返回信号 ...
- 使用cURL POST上传文件
使用cURL POST上传文件 http://blog.csdn.net/v6543210/article/details/20152575