Spring.NET环境搭建和基本API及XML配置笔记整理

说明:在最开始推荐一下刘冬的博客,他的博客提供了一些很好的范例,可以用于快速入门!本文是针对刘冬博客前两章内容的整理笔记,当然有部分增加和省去的部分,方便日后查阅,所以建议先读刘冬的博客园!本文不再赘述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<string,object> 所以需要转换类型,这里也体现了Spring.NET的一个诟病——性能问题。

//获取上下文

IApplicationContext ctx = Spring.Context.Support.ContextRegistry.GetContext();

//创建对象

对象类型 obj = ctx.GetObject("对象名") as 对象类型;

 

 

三、object节的基本配置:

Spring.NET的对象需要配置在objects节下,object节的id是对象名,是上面API方法的参数,后面是完整类型名称。

1.如果类含有构造函数,通过构造函数创建对象

<object id="personDao" type="CreateObjects.PersonDao, CreateObjects" />

2.创建内部类的对象:

<object id="person" type="CreateObjects.PersonDao+Person, CreateObjects" />

3.静态工厂(将创建知识封装到一个静态方法当中)

<object id="staticObjectsFactory" type="CreateObjects.StaticObjectsFactory, CreateObjects" factory-method="CreateInstance"/>

4.把工厂对象IOC,然后调用工厂对象创建实例

<object id="instanceObjectsFactory" type="CreateObjects.InstanceObjectsFactory, CreateObjects" /><!--工厂-->

<object id="instancePersonDao" factory-method="CreateInstance" factory-object="instanceObjectsFactory" /> <!--创建的对象-->

5.泛型需要转译左尖括号

<object id="genericClass" type="CreateObjects.GenericClass&lt;int>, CreateObjects" />

 

四、object节的属性:

1.默认是单例对象,如果想让对象不单例,需要配置参数

<object id="person" type="SpringNetScop.Person, SpringNetScop" singleton="false" />

2.默认是在IOC容器初始化时创建好对象,可以配置参数让对象在第一次运行时创建

<object id="personServer" type="SpringNetScop.PersonServer, SpringNetScop" lazy-init="true" />

 

五、object的子节点配置:

1. property用于给属性赋值

<object id="modernPerson" type="SpringNetIoC.ModernPerson, SpringNetIoC">

         //设置字段属性

         <property name="Name" value="李刚 "/>

         //注入其他类型的对象作为自己的属性,需要配置computer对象

<property name="Tool" ref="computer"/>

</object>

2.设值注入

<object id="modernPerson" type="SpringNetIoC.ModernPerson, SpringNetIoC">

<property name="Friend">

  <object type="SpringNetDi.Person, SpringNetDi">

      <property name="Name" value="Beggar"/>

      <property name="Age" value="23"/>

      <property name="Friend" ref="person"/>

    </object>

</property>

</object>

3.设定构造函数的参数,构造注入:

<object id="personDao" type="SpringNetDi.PersonDao, SpringNetDi">

  <constructor-arg name="argPerson" ref="person"/>

  <constructor-arg name="intProp" value="1"/>

</object>

4.注入List

<property name="Years">

  <list element-type="int">

    <value>1992</value>

    <value>1998</value>

    <value>2000</value>

  </list>

</property>

5.注入Dictionary

<property name="HappyTimes">

  <dictionary key-type="string" value-type="object">

    <entry key="第一开心" value="每天都能睡一个好觉"/>

    <entry key="第二开心" value-ref="happy"/>

  </dictionary>

</property>

 

六、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();

<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值