zoukankan      html  css  js  c++  java
  • Spring.NET教程(四)——容器中对象的作用域(基础篇)

    容器中对象的部署分为两种方式:singleton和非singleton(java里叫prototype)。这里的singleton指的是“单例模式”,就是说当一个对象被定义为singleton时,容器中就只会有一个共享的实例,任何时候通过id或别名请求该对象都会返回这个共享实例的引用(也就是说这个对象只会被创建一次)。当使用非singleton,或者说原型模式布署时,每次请求对象都会创建新的实例。在某些场合,如果需要为每个用户返回单独的用户对象或其它对象,非singlton布署模式就比较理想。Spring.NET默认为singleton模式。每次调用GetObject方法时得到的都是同样的实例;当singleton="false"时,每次调用GetObject方法时得到的则是不同的实例。

      <!--单例模式-->
      <object id="personDao" type="SpringNetScop.PersonDao, SpringNetScop" />

      CreateWithSingleton

            [Test]
            public void CreateWithSingleton()
            {
                string[] xmlFiles = new string[] 
                {
                    "assembly://SpringNetScop/SpringNetScop/Objects.xml"
                };
                IApplicationContext context = new XmlApplicationContext(xmlFiles);
                IObjectFactory factory = (IObjectFactory)context;
                object obj1 = factory.GetObject("personDao");
                object obj2 = factory.GetObject("personDao");
                Assert.AreEqual(obj1, obj2);
            }

    我们用NUnit可以看到下图:

      Spring.NET教程(五)——容器中对象的作用域(基础篇)

      图片看不清楚?请点击这里查看原图(大图)。

      使用singleton="false"的代码

      <!--非单例模式-->
      <object id="person" type="SpringNetScop.Person, SpringNetScop" singleton="false" />

      CreateWithOutSingleton

            [Test]
            public void CreateWithOutSingleton()
            {
                string[] xmlFiles = new string[] 
                {
                    "assembly://SpringNetScop/SpringNetScop/Objects.xml"
                };
                IApplicationContext context = new XmlApplicationContext(xmlFiles);
                IObjectFactory factory = (IObjectFactory)context;
                object obj1 = factory.GetObject("person");
                object obj2 = factory.GetObject("person");
                Assert.AreNotEqual(obj1, obj2);
            }

      Person

        public class Person
        {
            public Person()
            {
                Console.WriteLine("Person被实例");
            }
            public override string ToString()
            {
                return "我是Person";
            }
            ~Person()
            {
                Console.WriteLine("Person被销毁");

    图为:

      Spring.NET教程(五)——容器中对象的作用域(基础篇)

      图片看不清楚?请点击这里查看原图(大图)。

      这说明singleton=false后,每次调用GetObject方法获取的对象是不同实例的,当脱离调用方法(CreateWithOutSingleton)的作用域后,该实例会被Spring.NET容器销毁。

      lazy-init属性是指:当Spring.NET容器初始化的时候标注该属性的对象将被实例化,反之则是调用GetObject方法的时候才被实例化。

      <!--调用时加载-->
      <object id="personServer" type="SpringNetScop.PersonServer, SpringNetScop" lazy-init="true" />

      CreateWithLazy

            [Test]
            public void CreateWithLazy()
            {
                string[] xmlFiles = new string[] 
                {
                    "assembly://SpringNetScop/SpringNetScop/Objects.xml"
                };
                IApplicationContext context = new XmlApplicationContext(xmlFiles);
                IObjectFactory factory = (IObjectFactory)context;
                object dao = factory.GetObject("personDao");
                Console.WriteLine(dao.ToString());
                object server = factory.GetObject("personServer");
                Console.WriteLine(server.ToString());
            }

      PersonServer

        public class PersonServer
        {
            public PersonServer()
            {
                Console.WriteLine("PersonServer被实例");
            }
            public override string ToString()
            {
                return "我是PersonServer";
            }
        }

      如图:

      Spring.NET教程(五)——容器中对象的作用域(基础篇)

      图片看不清楚?请点击这里查看原图(大图)。

      PersonDao类未设置lazy-init属性,则当Spring.NET初始化时被实例;PersonServer类设置lazy-init="true",则当调用GetObject方法时才被实例。

      一般情况下可以有选择的设置lazy-init属性,正如双刃剑一样,设置为lazy-init=true的时候应用程序启动时会快一点,但是在启动的时候就不能够帮我们检测错误,但当调用的时候一旦发生错误,后果是不堪设想的。

      更多资料请查看Spring.NET中文手册。

     

  • 相关阅读:
    running Android Studio on Windows 7 fails, no Android SDK found
    Dalvik虚拟机简要介绍和学习计划
    免费HTTP上传文件控件WebUploadFile.ocx发布,让实现Word在线编辑器变得容易
    ASP.NET生成缩略图的代码
    C++ MFC 关于SelectObject,请解释下,谢谢
    Visual C++中MFC消息的分类
    深入思考全局静态存储区、堆区和栈区
    coredump简介与coredump原因总结
    c++函数中的 指针参数跟地址参数区别
    解决SWFUpload在Chrome、Firefox等浏览器下的问题
  • 原文地址:https://www.cnblogs.com/millen/p/1635948.html
Copyright © 2011-2022 走看看