zoukankan      html  css  js  c++  java
  • Spring中的单例模式和多例模式的应用

    在Spring的配置中,Bean的scope属性中存在两种模式:singleton(单例模式)、prototype(多例模式)

      singleton 单例模式:对象在整个系统中只有一份,所有的请求都用一个对象来处理,如service和dao层的对象一般是单例的。

                                            为什么使用单例:因为没有必要每个请求都新建一个对象的时候,因为这样会浪费CPU和内存。

            prototype 多例模式:对象在整个系统中可以有多个实例,每个请求用一个新的对象来处理,如action。

                 为什么使用多例:防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象的状态改变导致了对象对另一个请求做了错误的处理;

    实例:

    class User{
        private int id;
        private String name;
        private List<String> hobby;
        public void init(){
            System.out.println("初始化方法!");
        }
        public void distroy(){
            System.out.println("销毁方法!");
        }
            ......get and set方法
    }

     接下来在applicationContext.xml中配置Spring,配置User的Bean

    <Bean id="user" name="user" class="User" scope="singleton" init-methon="init" distroy-methon="distroy">
        <property name="id" value="1"></property>
        <property name="name" value="张三"></property>
        <property name="hobby">
            <list>
                <value>打篮球</value>
                <value>听歌</value>
            </list>
        </property>
    </Bean>

     Bean:该对象需要Spring来管理,将User对象交给Spring管理

    id 和 name:做用是一样的,给Bean取一个名字,可以通过这个名字获取到这个对象。使用name的话不能使用特殊字符,尽量使用id。

    class:完整的类名。也就是Bean对象所对应的类对象。

    scope:singleto 或者prototype。

    init-methon:初始化方法

    distroy-methon:销毁方法 

    property:通过name给类中的属性赋值value。

      如果这里name的类型为其它bean对象的映射可以写成

    <property name="user">
        <ref bean="user1"></ref>    //这里是映射的bean的id或name为user1的bean
    </property> 

      如果这里name的类型为集合类型,可以通过以上list例子对其进行赋值

        类型为list和set,只需要将标签对改成对应的集合类型就可以。

        如果类型为map     

    1 <map>
    2     <entry key="A" value-ref="user1"></entry>    //key为键,value-ref为bean的映射
    3 </map>

      这里通过property对类中的属性进行赋值可参考:https://blog.csdn.net/qq_21396469/article/details/63684769

    编写测试类:

    import org.junit.Test;  
    import org.springframework.context.support.ClassPathXmlApplicationContext;  
      
    public class Demo {  
        @Test  
        public void test(){  
            ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");  
            User user = (User) ac.getBean("user");  
            User user1 = (User) ac.getBean("user");  
           System.out.println(user);
           System.out.println(user1);
        }
    }

     单例模式运行的结果:

    初始化方法
    User@60c7531f User@60c7531f

     多例模式运行的结果:

    将scope改为prototype

    初始化方法
    初始化方法
    User@5891e34
    User@cb0ed20
  • 相关阅读:
    python 数字格式化
    Python字符串
    Nginx 深入-动静分离, 静态资源css, js 前端请求404问题
    Spring colud gateway 源码小计
    Nginx 场景应用
    Nginx valid_referer 防盗链
    Nginx 基础
    JNI 从零开始一次DEMO调用 IDEA 2018.2.5 + visual studio 2019
    Bitmap 图片说明
    HP激光打印机解密
  • 原文地址:https://www.cnblogs.com/EmilZs/p/9342344.html
Copyright © 2011-2022 走看看