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 ...
随机推荐
- CursorAdapter中getView newView bindView异同
Adapter的作用是界面与数据之间的桥梁,通过设置适配器至ListView控件后(如调用ListView的 setAdapter(ListAdapter adapter) ...
- ZooKeeper Java例子(六)
A Simple Watch Client 为了向你介绍ZooKeeper Java API,我们开发了一个非常简单的监视器客户端.ZooKeeper客户端监视一个ZooKeeper节点的改变并且通过 ...
- HDU 4609 FFT模板
http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意:给你n个数,问任意取三边能够,构成三角形的概率为多少. 思路:使用FFT对所有长度的个数进行卷积(\ ...
- windows修改文件的修改或者创建时间
https://www.online-tech-tips.com/computer-tips/how-to-change-the-last-modified-date-creation-date-an ...
- 安装在Linux下的jenkins执行windows下的bat命令
launch method里面没有 launch agent via java web start 默认是disable 需要改成random 转载自: http://blog.csdn.net/so ...
- bzoj 1965 数学
首先我们可以发现每张牌的对应关系,假设序号为x的牌,经过一次洗牌后的位置为: 2*x x<=n/2 2*(x-n/2)-1 x>n/2 那么我们可以将下面的式子化简,变成2*x-n ...
- 转载 JAVA SE 连接ACCESS
本代码实现连接 本机数据库的方法. 操作步骤: 1.进入控制面板,打开“管理工具→数据源(ODBC)”,弹出“ODBC数据源管理器”,在“用户DSN”选项卡中,单击选中名称为“Visio Databa ...
- 常见网络命令之Ping命令
前言:计算机网络老师要求我们自己总结一下常见的网络命,然后上课可以上去讲一下这些命令使用,像我这么听话的好学生,肯定是照老师要求,认真的总结了一下,总结的过程中,我发现网上已经有的资源讲的都不是很详细 ...
- pdf文件添加到word中
今天遇到了一个问题,如何把pdf文件添加到word中,而不是只添加图标,下面是解决方案: 1.用word 打开pdf文件: 2.打开word文件: 3.把1中的pdf文件复制粘贴 到2中的word文件 ...
- java基础 运算符
算数运算符 加号:在操作数值.字符.字符串时其结果是不同的,当两个字符相加得到的是ASCII码表值, 当两个字符串相加时表示将两个字符串连接在一起,从而组成新的字符串. 除号:整数在使用除号操作时,得 ...