多数用户都会将容器中的大部分对象布署为singleton模式。当一个singleton对象需要和另一个singleton对象协作,或者一个非singleton对象需要和另一个非singleson对象协作时,Spring.NET都能很好的处理它们的依赖关系。但是,如果对象的生存周期不同,就可能会产生问题。例如,假设一个singleton对象A要使用一个非singleton(原型)对象B,A中的每个方法都会用到B的新实例。由于A是singleton对象,容器只有会创建它一次,也就是说只有一次给A的属性赋值的机会,所以不可能在每次A需要的时候都给它注入一个新的B。

有一种解决的办法有点违背控制反转原则:类A可以通过实现IObjectFactoryAware接口来获取容器的引用,并调用GetObject("B")在每次需要的时候从容器中请求一个(新的)对象B。但这并不是一个很好的解决方案,因为客户代码此时必须要和Spring.NET发生紧耦合。

通过方法注入,我们可以用更优雅的方式解决类似的问题。(摘自Spring.NET中文手册)

  一、查询方法注入
  Spring.NET可以动态覆盖对象的抽象方法或虚方法,并且可以在容器内查找已命名对象,查询方法注入就利用了这些功能。个人感觉查询方法注入类似抽象工厂,为之不同的是,可以不用写抽象的实现代码,通过配置文件动态的切换组件。
  在lookup-method节点配置name和object属性

  实现代码如下:

Code
      <!--查询方法-->
      <object id="personDao" type="SpringNet_MethodDi.PersonDao, SpringNet_MethodDi" singleton="false"/>
      <object id="objectFactory" type="SpringNet_MethodDi.ObjectFactory, SpringNet_MethodDi">
        <lookup-method name="CreatePersonDao" object="personDao"/>
      </object>
LookupMethod
    //注意,可以直接在配置中定义这个类的对象
    public abstract class ObjectFactory   
    {
        //或者可以是一个虚方法    
        public abstract PersonDao CreatePersonDao();    
    }

    public class PersonDao
    {
        public void Save()
        {
            Console.WriteLine("保存数据");
        }
    }

  二、替换任意方法

  替换任意方法在项目中使用的很少,实现方法也比较复杂。至于Spring.NET为什么使用替换任意方法,我还不是很清楚,如果有知道使用场景的朋友可以给我留言。我个人认为其用途是:实现非派生类方法的重写或在IoC框架中简易的AOP拦截(这一点又不确定,以后我会写AOP方面的博客)。
  首先继承IMethodReplacer接口并实现Implement方法,object[] arguments为传入的参数。其次在replaced-method节点配置name和replacer属性,和增加arg-type节点且配置返回类型match属性
  代码如下:

Code
      <!--替换方法-->
      <object id="userDao" type="SpringNet_MethodDi.UserDao, SpringNet_MethodDi">
        <replaced-method name="GetValue" replacer="replaceValue">
          <arg-type match="String"/>
        </replaced-method>
      </object>
      <object id="replaceValue" type="SpringNet_MethodDi.ReplaceValue, SpringNet_MethodDi"/>
ReplacedMethod
    public class UserDao
    {
        //虚方法
        public virtual string GetValue(string input)
        {
            return null;
        }
    }

    //实现IMethodReplacer接口
    public class ReplaceValue : IMethodReplacer
    {
        public object Implement(object target, MethodInfo method, object[] arguments)
        {
            string value = (string)arguments[0];
            return "获取到:" + value;
        }
    }

  三、事件注入

  在Spring.NET的IoC框架中,除了提供方法注入以外,还提供事件的注入。通过事件的注入,可以使架构体系的耦合降到最低。(参考 clingingboy的 Spring.NET学习笔记(3)-注册事件注入)

  在listener节点处配置event和method属性指明事件名和绑定的方法,并增加ref节点设置object属性来指明调用哪个IoC容器对象。
  实现代码:

Code
      <!--事件注入-->
      <object id="men" type="SpringNet_MethodDi.Men, SpringNet_MethodDi">
        <listener event="OpenTheDoor" method="OpenThisDoor">
          <ref object="door"/>
        </listener>
      </object>          
      <object id="door" type="SpringNet_MethodDi.Door, SpringNet_MethodDi" />
Listener
    //先定义一个委托
    public delegate string OpenHandler(string arg);

    public class Door
    {
        public event OpenHandler OpenTheDoor;

        public void OnOpen(string arg)
        {
            //调用事件
            if (OpenTheDoor != null)
            {
                Console.WriteLine(OpenTheDoor(arg));
            }
        }
    }

    public class Men
    {
        public string OpenThisDoor(string arg)
        {
            return "参数是:" + arg;
        }
    }

  

  调用部分代码:

Program
class Program
    {
        static void Main(string[] args)
        {
            IApplicationContext ctx = ContextRegistry.GetContext();

            Console.WriteLine("查询方法");
            ObjectFactory factory = (ObjectFactory)ctx.GetObject("objectFactory");
            factory.CreatePersonDao().Save();
            Console.WriteLine();

            Console.WriteLine("替换方法");
            UserDao dao = (UserDao)ctx.GetObject("userDao");
            Console.WriteLine(dao.GetValue("Liu Dong"));
            Console.WriteLine();

            Console.WriteLine("事件注册");
            Door door = (Door)ctx.GetObject("door");
            door.OnOpen("Opening!");
            Console.WriteLine();

            Console.ReadLine();
        }
    }

  

  输入效果:

  代码下载

  返回目录

转载于:https://www.cnblogs.com/GoodHelper/archive/2009/11/11/SpringNet_Method.html

Spring.NET学习笔记10——方法的注入(基础篇) Level 200相关推荐

  1. Spring.NET学习笔记13——AOP的概念(基础篇) Level 200

    上篇我们简单的了解了AOP的应用场景,知道AOP编程的重要性.这篇我们先看一段代码,来开始今天的学习. 回顾与上篇类似的代码:SecurityService类的IsPass判断用户名为"ad ...

  2. Spring.NET学习笔记15——AOP的配置(基础篇) Level 200

    上篇我学习了Spring.NET的四种通知类型,AOP的实现方案比较复杂,是通过代码实现的.而Spring.NET框架给我们提供了配置的方式来实现AOP的功能.到目前为止,我们已经讨论过使用Proxy ...

  3. Spring.NET学习笔记11——自定义对象行为(基础篇) Level 200

    Spring.NET通过几个专门的接口来控制容器中对象的行为.说到对象的行为无非就要提到对象的生命周期控制.类似在WinForm开发,Form生命周期中,Load方法为Form的载入方法和Dispos ...

  4. Spring.NET学习笔记12——面向切面编程(基础篇) Level 300

    AOP即面向切面编程(Aspect Oriented Programming的缩写),是OOP(面向对象编程)的一种延续形式.是通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添 ...

  5. Spring.NET学习笔记8——集合类型的注入(基础篇) Level 200

    Spring.NET还支持集合类型的注入.而且使用起来也比较方便. 一.ILIst类型 使用<list>元素作为ILIst的标签,value为集合中元素的值.也可以注入对象,甚至关联其它对 ...

  6. 动力节点王鹤SpringBoot3学习笔记——第二章 掌握SpringBoot基础篇

    目录 二.掌控SpringBoot基础篇 2.1 Spring Boot ? 2.1.1 与Spring关系 2.1.2 与SpringCloud关系 2.1.3  最新的Spring Boot3 新 ...

  7. Spring框架学习笔记10:基于XML配置方式SSM框架西蒙购物网

    文章目录 一.网站功能需求 二.网站设计思路 1.设计模式 2.网站前台 3.网站后台 4.购物流程图 三.网站运行效果 四.网站实现步骤 (一)创建数据库与表 1.创建数据库 - simonshop ...

  8. Spring.NET学习笔记1——控制反转(基础篇) Level 200

    在学习Spring.NET这个控制反转(IoC)和面向切面(AOP)的容器框架之前,我们先来看一下什么是控制反转(IoC). 控制反转(Inversion of Control,英文缩写为IoC),也 ...

  9. 黑马程序员C++学习笔记<第一阶段_基础篇>

    配套视频网址: 黑马程序员:http://yun.itheima.com/course/520.html?bili B站:https://www.bilibili.com/video/BV1et411 ...

最新文章

  1. c++map的使用_mybatis源码 | mybatis插件及动态代理的使用
  2. LoadRunner监控Linux的三种方法
  3. 144显示器只有60_HKC IG27电竞显示器体验:27英寸+IPS+144Hz,千元平民价值不值?...
  4. 尝试修改LabelImg,将以对顶角画框改成以对角线相交点向四周画框
  5. TP5 连接oracle数据库
  6. B站up主用AI还原李焕英 动态影像
  7. 等保2.0标准_信息安全技术标准与等保2.0
  8. 高中生计算机创新大赛作品,2017 第十届“英特尔杯”全国大学生软件创新大赛获奖作品...
  9. java web不用框架_初学javaweb,远离各自框架
  10. Mac使用VMware、Ubuntu安装配置虚拟机Linux
  11. 深度学习之LSTM完全图解
  12. 前嗅ForeSpider教程:采集新浪新闻
  13. amd服务器虚拟化,着眼未来 AMD皓龙产品从“芯”实现虚拟化
  14. 冒险岛2无限服务器断开,冒险岛2无限龙无限命版
  15. 大疆激光雷达livox avia 在ubuntu18.04+ROS中基本使用方法
  16. 只在此山中,云深不知处
  17. H3C IRF MAD检测实战
  18. windows搭建redis服务,ruby服务
  19. Boost.Asio基本原理
  20. 社区老年人服务系统设计与实现(安卓APP+SSH后台+MYSQL)

热门文章

  1. java clone方法_java安全编码指南之:方法编写指南
  2. android通讯录上传服务器,Android 实现读取通讯录并上传服务器
  3. 编辑流程图_如何使用ProcessOn快速绘制一张高颜值流程图?
  4. java 中适配器原理_Java经典设计模式中关于适配器模式原理以及用法详解
  5. 用python公众号开书城步骤_资源 | 开放Python书籍:一本短小精悍的初学者入门指南...
  6. java文字转语音支持ubuntu系统_微信内测语音进度条,60秒语音终于有救了?腾讯:并没有...
  7. python实现rsa加密源代码_python实现RSA加密(解密)算法
  8. 对标 VS Code,JetBrains 的下一代 IDE :Fleet
  9. 上午写了一段代码,下午就被开除了...
  10. 一个小小指针,竟把Linux内核攻陷了!