说明:在最开始推荐一下刘冬的博客,他的博客提供了一些很好的范例,可以用于快速入门!本文是针对刘冬博客前两章内容的整理笔记,当然有部分增加和省去的部分,方便日后查阅,所以建议先读刘冬的博客园!本文不再赘述XML、反射,设计模式、解耦相关理论、依赖注入概念!
博客地址:http://www.cnblogs.com/GoodHelper/archive/2009/11/20/SpringNet_Index.html
Spring.NET官网:http://www.springframework.net/
一、环境部署:
照着刘冬的博客和中文文档的配置方法,我都没法正常搭起Spring.NET的环境,现在给一个自己总结的靠谱的:
1.新建一个控制台应用程序,添加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> <spring> <context> <resource uri="assembly://程序集名称/项目名称/Objects.xml"/> context> spring> configuration>
其中resource的配置方式是使用的XML方式,毕竟我们不希望把对象写到App.config里。
2.添加Objects.xml文件,设置属性-生成操作为“嵌入的资源”:
xml version="1.0" encoding="utf-8" ?> <objects xmlns="http://www.springframework.net"> objects>
我们的对象就写在这个配置文件里。
3.添加对Common.Logging.dll和Spring.Core.dll的引用,使用AOP请引用Spring.AOP.dll。
4.建立解决方案文件夹“Schema”,拷入"源码目录\doc\schema”当中的xsd,用于智能提示。
至此基本环境搭建完毕。
二、获取对象所用的API
Spring.NET的对象都是在XML里定义的,建议使用IApplicationContext,通过继承关系就能看出来它所包含的功能要比IObjectFactory要多(刘冬博客用的就是IObjectFactory作为示例)。IoC容器的底层实际就是Dictionary
//获取上下文
IApplicationContext ctx = Spring.Context.Support.ContextRegistry.GetContext();
//创建对象
对象类型 obj = ctx.GetObject("对象名") as 对象类型;
三、object节的基本配置:
Spring.NET的对象需要配置在objects节下,object节的id是对象名,是上面API方法的参数,后面是完整类型名称。
1.如果类含有构造函数,通过构造函数创建对象
2.创建内部类的对象:
3.静态工厂(将创建知识封装到一个静态方法当中)
4.把工厂对象IOC,然后调用工厂对象创建实例
5.泛型需要转译左尖括号
四、object节的属性:
1.默认是单例对象,如果想让对象不单例,需要配置参数
2.默认是在IOC容器初始化时创建好对象,可以配置参数让对象在第一次运行时创建
五、object的子节点配置:
1. property用于给属性赋值
//设置字段属性
//注入其他类型的对象作为自己的属性,需要配置computer对象
2.设值注入
3.设定构造函数的参数,构造注入:
4.注入List
5.注入Dictionary
六、AOP的API
实质上就是在运行时根据类型信息反射创建一个类的代理类,并调用用户写的通知方法,从这个机制上就能看出性能不会太高,个人建议对服务层之类的接口进行AOP,没必要的话不要轻易AOP。另外AOP也可以通过XML来配(见刘冬的博客)。
//1.创建目标类的对象(要拦截的对象)
IXXX target = new XXX();
//2.创建代理工厂
ProxyFactory factory = new ProxyFactory(target);
//3.定义通知
factory.AddAdvice(new AroundAdvise());
factory.AddAdvice(new BeforeAdvise());
factory.AddAdvice(new AfterReturningAdvise());
factory.AddAdvice(new ThrowsAdvise());
//4.通过代理工厂得到目标对象的代理对象
IXXX proxy = (IXXX)factory.GetProxy();
//5.通过代理调用方法
Proxy.Method();