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 ...
随机推荐
- C++指针与数组
对数组地址的理解,如 int c[2] = {2,3}; int(*cp)[2] = &c; cout << &c[0] << c << cp &l ...
- 任务调度 Quartz 学习(一) SimpleTrigger
概述: 在实际开发过程中,会遇到很多任务调度的需求. 比如说:某网站要在每周一上午9点更新网站数据,并发邮件通知用户: 再比如某论坛需求:每隔半个小时生成精华文章的RSS文件,每天凌晨统计论坛用户的积 ...
- Spring Security 集成CAS实现单点登录
参考:http://elim.iteye.com/blog/2270446 众所周知,Cas是对单点登录的一种实现.本文假设读者已经了解了Cas的原理及其使用,这些内容在本文将不会讨论.Cas有Ser ...
- HDFS不存在绝对路径,无法找到文件所在具体位置
This is set in the dfs.datanode.data.dir property, which defaults to file://${hadoop.tmp.dir}/dfs/da ...
- bzoj 1577: [Usaco2009 Feb]庙会捷运Fair Shuttle——小根堆+大根堆+贪心
Description 公交车一共经过N(1<=N<=20000)个站点,从站点1一直驶到站点N.K(1<=K<=50000)群奶牛希望搭乘这辆公交车.第i群牛一共有Mi(1& ...
- PHP 练习2:投票
1.建立数据库 表1:DiaoYanTiMu 表2:DiaoYanXuanXiang 2.页面 页面1:投票首页 <!DOCTYPE html PUBLIC "-//W3C//DTD ...
- iOS-Apple苹果iPhone开发公开API
iOS-Apple苹果iPhone开发 //技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilo ...
- python初步学习-python数据类型-列表(list)
列表 list 在 python 中具有非常强大的功能 定义 在python中,用方括号表示一个list:[] 在方括号里面,可以是 int,也可以是 str类型的数据,甚至也可以是Flase/Tru ...
- JVM在遇到OOM(OutOfMemoryError)时生成Dump文件
方法一: 命令:jmap -dump:format=b,file=heap.bin file:保存路径及文件名pid:进程编号(windows通过任务管理器查看,linux通过ps aux查看) du ...
- Spark实现销量统计
package com.mengyao.examples.spark.core; import java.io.Serializable; import org.apache.hadoop.io.Nu ...