zoukankan      html  css  js  c++  java
  • spring.Net (Mvc)属性依赖注入------实例化对象

    1.添加对Common.Logging.dll 、Spring.Core.dll、Spring.Web.dll、Spring.Web.Mvc3.dll的引用

    2.到web.config里面配置web结点

     <configSections>
        <!--Spring。Net配置节点-->
        <sectionGroup name="spring">
          <section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc3"/>
        </sectionGroup>
      </configSections>
      <!--Spring.Net节点详细配置-->
      <spring>
        <context>
            <!--config文件夹下的controllers.xml文件-->
          <resource uri="file://~/Config/controllers.xml"/>
        </context>
      </spring>

    注意: congfigsection结点放在configuration结点下的首位 ,  同时建立一个Config文件夹 并在里面创建controllers.xml文件用来存储相关数据

    3.global.asax文件 将MvcApplication类修改继承自SpringMvcApplication

    4.在controllers.xml中添加需要注入的结点配置

    例如:给RoleInfo控制器下的RoleInfoService属性注入

    namespace Sept10.OA.MVC.Controllers
    {
        public class RoleInfoController : BaseController
        {
            public IRoleInfoService RoleInfoService { get; set; }
            // GET: /RoleInfo/
    
            public ActionResult Index()
            {
    //注入后不会报错 ViewData.Model
    = RoleInfoService.LoadEntities(u => u.ID == id).FirstOrDefault(); return View(); } } }

    controllers.xml配置:

     1   <!--type=命名空间+类型,程序集名称  singleton确定是否为单例模式-->
     2   <object type="Sept10.OA.MVC.Controllers.RoleInfoController,Sept10.OA.MVC" singleton="false" >
     3     <!--类的属性名称,ref参考来源名称-->
     4     <property name="RoleInfoService" ref="RoleInfoService" />
     5   </object>
     6 
     7 
     8 
     9   <!--配置Service-----type=需要实例化对象的命名空间+类型,程序集名称-> 
    10 <object name="RoleInfoService" type="Sept10.OA.BLL.RoleInfoService,Sept10.OA.BLL" singleton="false" > 11 </object>

    5.spring注入一般属性,也可以直接注入 。如 <property name="name" value="张三"></property>

    如果是静态的属性的话,如果想让它有注入的值,那么必须先创建一个实例后,才会注入。

    因为静态方法调用的时候,不需要spring容器创建实例。所以属性并没有注入进去。

    例如CacheHelper类中的静态属性  ICacheWriter CacheWriter {get;set;}
    那么在类的静态构造函数内部,逼迫spring容器给我们创建一个CacheHelper,那么顺便
    就给当前 的静态属性CacheWriter做注入操作了。所以,下面的所有的静态方法在用的时
    侯就可以有实例了。

    static CacheHelper()
            {  //创建 spring容器上下文
             IApplicationContext ctx = ContextRegistry.GetContext();
    var userInfoDal = ctx.GetObject("CacheHelper") as CacheHelper;
    }
      <object name="CacheHelper" type="Test.OA.Common.CacheHelper,Test.OA.Common" singleton="false" >
        <property name="CacheWriter" ref="MemmcachedWriter" />
      </object>
      
      <object name="MemmcachedWriter" type="Test.OA.Common.MemmcachedWriter,Test.OA.Common" singleton="false" >
      </object>

    spring 不仅可以注入属性 ,也可以构造器参数注入

    <constructor-arg index="0" value="xxx">

     其中 index表示第几个参数。

    此外spring还可以替换方法,这是一种用的比较少的注入方式。在Spring的配置中,通过replaced-method在需要替换类中指定需要被替换的方法,以及被哪个类替换。替换类应该实现Spring.Objects.Factory.Support中的IMethodReplacer接口。IMethodReplacer接口只有一个object Implement(object target, MethodInfo method, object[] arguments)方法。当我们调用被替换类中相应方法时,会执行Implement方法。

    如下面的例子:

      <object name="UserInfoDal"  type="SpringNetDemo.AdoNetUserInfoDal,SpringNetDemo">
        <property name="Name" value="Demo"/>
    <replaced-method name="Show" replacer="TestDal">
    
    
    <object id="TestDal" type="xxxxxx,xxxx">
    public class TestDal : IMethodReplacer 
       {
           public object Implement(object target, MethodInfo method, object[] arguments)
            {
                  Console.WriteLine("类的名称:{0}",target.ToString());
                  Console.WriteLine("方法名为 :{0}",method.Name);
                  if (arguments.Length > 0)
                  {
                      Console.WriteLine("传入的第一个参数是 :{0}", arguments[0].ToString());
                 }
                 return new object();
             }
          }

    就成功的替换了userinfodal 里面的show方法。

    6.控制台应用程序下 spring 通过容器创建实例 通过读取相关配置  创建容器获取对应的object节点对应的实例  如下就创建UserInfoDal了实例:

              // 创建 spring容器上下文
                IApplicationContext ctx = ContextRegistry.GetContext();
    
                IUserInfoDal userInfoDal = ctx.GetObject("UserInfoDal")             as IUserInfoDal;
    <objects xmlns="http://www.springframework.net">
      <!--放容器里面的所有的节点-->
      <object name="UserInfoDal"  type="SpringNetDemo.AdoNetUserInfoDal,SpringNetDemo">
        <property name="Name" value="Demo"/>
      </object>
    </objects>
     
  • 相关阅读:
    YCSB测试Mysql,MongoDB,TokuMX,Couchbase性能
    使用FIO对SATA、SSD和PCIe Flash进行测试
    使用jenkins实现持续集成
    linux服务器性能(网卡流量、CPU、内存、磁盘使用率)监控
    Linux下Hadoop2.7.1集群环境的搭建(超详细版)
    10分钟学会js处理json常用方法
    springboot:Java模板引擎Thymeleaf介绍
    springboot使用遇到问题:Class “model.Address” is listed in the persistence.xml file but not mapped
    eclipse4.6.1安装SpringSource Tool Suite(sts-eclipse)插件
    由一条sql语句想到的子查询优化
  • 原文地址:https://www.cnblogs.com/x0216u/p/4869423.html
Copyright © 2011-2022 走看看