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 ...
随机推荐
- MyBatis插件及示例----打印每条SQL语句及其执行时间
Plugins 摘一段来自MyBatis官方文档的文字. MyBatis允许你在某一点拦截已映射语句执行的调用.默认情况下,MyBatis允许使用插件来拦截方法调用 Executor(update.q ...
- AndroidStudio下加入百度地图的使用(一)——环境搭建
AndroidStudio下加入百度地图的使用(一)--环境搭建 最近有学生要做毕业设计,会使用到定位及地图信息的功能,特此研究了一下,供大家参考,百度定位SDK已经更新到了5.0,地图SDK已经更新 ...
- 其他:OI竞赛中的文件操作
本文介绍三种方法进行文件输入输出,都非常实用 第一种方法是采用重定向的形式进行输入输出,很方便 freopen("input.txt","r",stdin); ...
- web api 支持cors
1. configservice //******************* cors start *********************** var urls = Configuration[S ...
- iOS多线程
iOS开发Demo(示例程序)源代码
本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址(2013年12月29日更新版) iOS程序源代码下载链接:01.大任务.zip22 ...
- Centos服务器ssh免密登录以及搭建私有git服务器
一.概述 服务器的免密登录和git服务器的搭建,关键都是要学会把自己用的机器的公钥添加到服务器上,让服务器“认识”你的电脑,从而不需要输入密码就可以远程登录服务器上的用户 免密登录当然是登录root用 ...
- javascript语言中的一等公民-函数
简介 在很多传统语言(C/C++/Java/C#等)中,函数都是作为一个二等公民存在,你只能用语言的关键字声明一个函数然后调用它,如果需要把函数作为参数传给另一个函数,或是赋值给一个本地变量,又或是作 ...
- 抓起根本(二)(hdu 4554 叛逆的小明 hdu 1002 A + B Problem II,数字的转化(反转),大数的加法......)
数字的反转: 就是将数字倒着存下来而已.(*^__^*) 嘻嘻…… 大致思路:将数字一位一位取出来,存在一个数组里面,然后再将其变成数字,输出. 详见代码. while (a) //将每位数字取出来, ...
- win10远程桌面配置
Win10连接远程桌面的时候提示您的凭证不工作该怎么办? http://www.cnblogs.com/zhuimengle/p/6048128.html 二.服务器端 1.依旧进入组策略,不过是在服 ...
- mapper.xml中的<sql>标签
原文链接:http://blog.csdn.net/a281246240/article/details/53445547 sql片段标签<sql>:通过该标签可定义能复用的sql语句片段 ...