1.Spring.Net是一个开源的应用程序框架,可以简化开发
主要功能
(1)实现控制反转(IOC/DI),也就是不要直接new,依赖于接口
(2)面向切面编程(AOP),就是向程序中利用委托注册事件
简单来说:Spring.Net是一个轻量级的控制反转和面向切面的容器框架。
2.Spring.Net提供的dll说明
Spring.Core.dll:包含Spring.Net框架基于的核心工具类,Spring.Net其他组件都要使用这里的类,是其他组件的基本核心
Spring.Aop.dll:Spring.Net的AOP框架
Spring.Web.dll:提供了对Web的支持
Spring.Web.Mvc3.dll:Spring.Net自己的Web框架
Common.Logging.dll:Spring.Net日志功能
3.Spring.Net的两个重要的容器类
IObjectFactory通常称为Object容器
IApplicationContext通常称为应用上下文。它的功能要多于IObjectFactory,如它可以加载外部的资源文件、可以自动进行AOP切面、可以识别自动代理的类等
区别:
IObjectFactory只有当需要获取一个对象时才会去创建。
IApplicationContext在启动时一次初始化所有的实例,可以自动识别代理类、可以识别自动加载等(推荐使用)
4.理解IOC和DI
IOC(Inversion of Control,控制反转),控制反转就是应用程序本身不负责依赖对象的创建及维护,依赖对象的创建和维护是由外部容器负责。这样控制权就由应用程序本身转移到了外部容器,控制权的转移就是所谓的反转。
DI(Dependency Injection,依赖注入)就是在运行期由外部容器动态的将依赖对象注入到组件中或是在运行期,由外部容器决定具体执行的类。
5.通过属性注入
注入值类型属性
给Object注入集合
给Object注入其他Object
6.通过构造函数注入
7.通过配置文件中实例的对象默认是单例的,可以进行设置singleton="false"
8.自动装配autowire="byName" autowire="byType"
根据属性名称去查找object中name相同的对象
根据类型去查找object中类型相同的对象
核心代码:
Web.config
<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=169433 --> <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> <spring> <context> <resource uri="assembly://SpringDemo/SpringDemo/Objects.xml" /><!--使用外部的资源文件,程序集命名空间/程序集名称/配置文件名称--> <!--<resource uri="config://spring/objects"/>--> <!--使用配置文件中的配置--> </context> <!--<objects> </objects>--> </spring> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> </system.web> </configuration>
Objects.xml
<?xml version="1.0" encoding="utf-8"?> <objects xmlns="http://www.springframework.net"> <object id="XiaoLei" type="SpringDemo.Models.Student,SpringDemo"> <property name="Name" value="通过配置文件属性注入的小雷"></property> <property name="Pet"> <object type="SpringDemo.Models.Dog,SpringDemo"> <property name="Name" value="Ruiky" /> </object> </property> <!--属性对象注入--> <property name="Names"> <list element-type="string"> <value>张三</value> <value>张三1</value> <value>张三2</value> </list> </property> <property name="GirlFriends"> <dictionary key-type="string" value-type="int"> <entry key="刘亦菲" value="18"/> <entry key="舒畅" value="20"/> </dictionary> </property> <property name="Hobits"> <set > <value>女</value> <value>钱</value> <value>车</value> <object type="SpringDemo.Models.Dog,SpringDemo"> <property name="Name" value="Ruiky" /> </object> </set> </property> </object> <!--构造函数注入--> <object id="car1" type="SpringDemo.Models.Car,SpringDemo" singleton="false"><!--singleton单例,默认是true--> <constructor-arg value="宝马"/> <constructor-arg value="10000000"/> <property ref="dog1" name="MyDog"/><!--使用ref引用dog1对象的实例--> </object> <object id="car2" type="SpringDemo.Models.Car,SpringDemo" singleton="false" autowire="byName"> <!--singleton单例,默认是true,autowire根据名称自动装配,自动查找配置文件中object中name=属性名称的对象自动实例化--> <!--autowire也可以为byType,根据属性的类型来从object中查找,但是如果查找的类型多于一个,就会出错--> <constructor-arg value="宝马"/> <constructor-arg value="10000000"/> <!--<property ref="dog1" name="MyDog"/> --><!--使用ref引用dog1对象的实例--> </object> <object id="dog1" name="MyDog" type="SpringDemo.Models.Dog,SpringDemo"> <property name="Name" value="dog1"/> </object> </objects>
WebForm1.aspx.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using Spring.Context; using Spring.Objects.Factory; using SpringDemo.Models; namespace SpringDemo { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //IObjectFactory factory = Spring.Context.Support.ContextRegistry.GetContext(); IApplicationContext context = Spring.Context.Support.ContextRegistry.GetContext(); IPerson stu1 = context.GetObject("XiaoLei") as Student; Response.Write(stu1.Name+"</br>");//通过配置文件属性注入的名称 Response.Write(stu1.Pet.Name + "</br>");//通过配置文件属性对象注入 foreach (string name in stu1.Names) { Response.Write(name + "</br>"); //通过配置文件属性集合注入 } foreach (KeyValuePair<string, int> name in stu1.GirlFriends) { Response.Write(name.Key + "-----"+name.Value+"</br>"); //通过配置文件属性集合注入 } foreach (object obj in stu1.Hobits) { Response.Write(obj+"</br>"); //通过配置文件属性集合注入 } //构造函数注入 Car car = context.GetObject("car1") as Car; Response.Write(car.Name+" ----"+car.Price+"<br/>"); //默认从配置文件中取出来的实例是单例的,可以进行设置 singleton="false" Car car1 = context.GetObject("car1") as Car; Response.Write((car==car1)+ "<br/>"); //引用配置文件中的对象 Response.Write(car1.MyDog.Name+"<br/>"); Car car2 = context.GetObject("car2") as Car; Response.Write(car2.MyDog.Name + "<br/>"); } } }
源码链接:http://yunpan.cn/Q7sbQIiIRDZtV (提取码:b68c)