Spring bean配置单例或多例模式方式

目录
  • Spring bean配置单例或多例模式
    • 单例
    • 多例
  • Spring scope配置单例、多例模式
    • 1、scope属性介绍
    • 2、scope配置
    • 3、单例模式底层实现模拟

Spring bean配置单例或多例模式

单例

spring bean 默认是单例默认,在对应.xml文件中的配置是:

<bean id="user" class="..." scope="singleton"/>

singleton就是配置这个bean是否是单例的,如果不写,就是默认值true。

单例模式:每个bean定义只生成一个对象实例,每次getBean请求获得的都是此实例

单例模式分为饿汉模式和懒汉模式,

饿汉模式 spring singleton的缺省是饿汉模式:启动容器时(即实例化容器时),为所有spring配置文件中定义的bean都生成一个实例
懒汉模式 在第一个请求时才生成一个实例,以后的请求都调用这个实例spring singleton设置为懒汉模式:<beansdefault-lazy-init="true">

多例

配置多例:

<bean id="user" class="..." scope="prototype"/>

多例模式:任何一个实例都是新的实例,调用getBean时,就new一个新实例

Spring scope配置单例、多例模式

1、scope属性介绍

scope="“是标签的一个属性,作用是:控制对象的作用范围(单例、多例模式)

取值:scope=”"是标签的一个属性,作用是:控制对象的作用范围(单例、多例模式)

当时导入包spring-mvc和包spring-mvc-portlet可以使用下列值(web应用):

  • request:当每次请求时实例化。
  • session:当在一个session周期内,对象时单例的。
  • globalSession:依赖包spring-mvc-portlet,类似于session.
  • application:在一个application对象内是单例的。
  • singleton:默认值,单例模式;
  • prototype:多例,每次获取对象都会重新实例化;

所需包:

2、scope配置

Application.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    <bean id="user" class="Model.User" scope="singleton">
        <aop:scoped-proxy/>
    </bean>
</beans>

3、单例模式底层实现模拟

3.1、 模拟单例模式 — 懒汉式

**懒汉式的优点是:**

1、提升运行效率;

2、实现数据共享,例如application对象,application对象单例模式,在程序启动,对象实例化之后,程序结束之前,实例化的对象都可以实现共享。

懒汉式的缺点是:使用了多线程锁机制,导致效率低。

实现:

package SingleTon;
public class SingleTon {
    private static SingleTon singleTon;
    /**
     * 创建对象一般都是用new XX(),此处XX()是类对象的无参构造方法
     * 一般无参构造方法都public XX(){},但是单例模式使用private修饰构造方法,
     * 这样是为了不让其它类创建单例对象。
     *
     * 构造方法的两个条件:方法名与类名相同,没有返回值
     */
    private SingleTon(){
    }
    /**
     * 实例方法,使用实例方法创建对象,
     * 因为实例方法需要对象才能调用,然而构造方法时private修饰的,其他类不能使用,
     * 因此实例方法应该是静态的(static),使用public修饰,其他类可以使用,返回值要是类对象.
     *
     */
    public static SingleTon getInstance(){
        /**
         * 判断对象是否已经被创建,要有一个全局的类类型的参数
         * 静态方法不能使用非静态的变量,因此变量应该设置成静态的(static)
         */
        if(singleTon == null){
            /**
             * 如果是多线程的,此处需要使用锁,所对象使用该类对象
             * 例如:同时两个线程使用该对象,该对象还为实例化,此处如果不使用锁就会导致对象被重复实例化,不符合单例模式
             */
            synchronized(SingleTon.class){
                /**
                 * 双重验证,防止多线程重复实例化对象
                 *
                 * 使用锁缺点:效率较低。
                 */
                if(singleTon == null){
                    new SingleTon();
                }
            }
        }
        return singleTon;
    }
}

3.2、饿汉式:优点是解决了懒汉式效率低的缺点。

package SingleTon;
/***
 * 单例模式 -- 饿汉式
 */
public class SingleTon2 {
    /**
     * 饿汉式构造方法、全局变量、实例方法都与懒汉式一样,区别在于饿汉式在全局变量处就已经实例化了对象
     * 饿汉式不用考虑多线程问题,解决了懒汉式效率低的问题。
     */
    private static SingleTon2 singleTon2 = new SingleTon2();
    /**
     * 构造方法
     */
    private SingleTon2(){}
    /**
     * 实例方法
     */
    public static SingleTon2 getInstance(){
        return singleTon2;
    }
}

3.3、测试方法:

package SingleTon;
public class Test {
    public static void main(String[] args) {
        SingleTon singleTon = SingleTon.getInstance();
        System.out.println(singleTon);
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot如何读取xml配置bean(@ImportResource)

    目录 读取xml配置bean(@ImportResource) 1.应用场景 2.spring-common.xml 3.SpringBoot读取xml 4.应用xml中的bean对象 5.Service类 6.测试 读取配置文件中的参数 1.打开eclipse开发工具软件 2.在项目中确保pom.xml文件已引用 3.在项目中的src/main/resource文件录目下 4.在application.properties配置文件中添加对应的参数 5.此时在项目启动的时候 6.在需要使用的配置

  • Spring探秘之如何妙用BeanPostProcessor

    目录 前言 BeanPostProcessor简介 BeanPostProcessor实战 总结 前言 最近,在给项目组使用Spring搭建Java项目基础框架时,发现使用Spring提供的BeanPostProcessor可以很简单方便地解决很多看起来有点难解决的问题.本文将会通过一个真实案例来阐述BeanPostProcessor的用法 BeanPostProcessor简介 BeanPostProcessor是Spring IOC容器给我们提供的一个扩展接口.接口声明如下: public

  • Spring Bean Scope 有状态的Bean与无状态的Bean

    有状态会话bean:每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”:一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束.即每个用户最初都会得到一个初始的bean.         无状态会话bean:bean一旦实例化就被加进会话池中,各个用户都可以共用.即使用户已经消亡,bean   的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用.由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean.但无状态会话bean  

  • spring Bean创建的完整过程记录

    目录 前言 bean创建的流程图 快速开始 总结 前言 复习一下spring实现IOC的源码流程准备工作: ​强烈建议大家从git上拉取spring源码来学习Spring源码.因为里面相较于IDEA生成的会有注释,里面有的方法会有注释看起来会省力一点. ​以下都是用5.0.2版本来做阐述. bean创建的流程图 写在前面:建议大家一定要自己用实例跑一遍,做好记录.如果只是看看会非常抽象.此流程图作为梗概,便于加强记忆和理解,新手或无基础的有个印象即可.等跟随本文走通一遍,在回过头看这个图,或许会

  • Spring @bean和@component注解区别

    目录 Spring 中的一些注解 2. Autowire 和 @Resource 的区别 3. 将一个类声明为 Spring 的 bean 的注解有哪些? 4. @Configuration :配置类注解 5. @ControllerAdvice :处理全局异常利器 6. @Component, @Repository, @Service 的区别 总结 本文打算介绍几个不太容易说出其区别,或者用途的 Spring 注解,比如 @Component 与 @Bean 的比较,@ControllerA

  • Spring bean配置单例或多例模式方式

    目录 Spring bean配置单例或多例模式 单例 多例 Spring scope配置单例.多例模式 1.scope属性介绍 2.scope配置 3.单例模式底层实现模拟 Spring bean配置单例或多例模式 单例 spring bean 默认是单例默认,在对应.xml文件中的配置是: <bean id="user" class="..." scope="singleton"/> singleton就是配置这个bean是否是单例

  • Spring bean为什么默认是单例

    熟悉Spring开发的朋友都知道Spring提供了5种scope分别是singleton.prototype.request.session.global session. 如下图是官方文档上的截图,感兴趣的朋友可以进去看看这五种分别有什么不同.今天要介绍的是这五种中的前两种,也是Spring最初提供的bean scope singleton 和 prototype. Spring官方文档介绍如下图: 更多内容可以看官方文档介绍,非常详细: https://docs.spring.io/spri

  • Spring中Bean的单例和多例使用说明

    目录 Bean的单例和多例使用 实战演示 Spring单例bean与原型bean区别和创建过程 singletonScope与prototypeScope Bean的单例和多例使用 在Spring中,bean可以被定义为两种模式:prototype(多例)和singleton(单例) singleton(单例):只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实例. prototype(多例):对这个bean的每次请求都会创建一个新的bean实例,类似于new. Spring

  • spring中向一个单例bean中注入非单例bean的方法详解

    目录 前言 错误实例演示 实现ApplicationContextAware接口 lookup method lookup method签名 总结 前言 看到这个题目相信很多小伙伴都是懵懵的,平时我们的做法大都是下面的操作 @Component public class People{ @Autowired private Man man; } 这里如果Man是单例的,这种写法是没有问题的,但如果Man是原型的,这样是否会存在问题. 错误实例演示 这里有一个原型(生命周期为prototype)的

  • 浅谈Spring 的Controller 是单例or多例

    背景:今天写代码遇到一个Controller 中的线程安全问题,那么Spring 的Controller 是单例还是多例的呢?若为单例又如何保证并发安全呢? 一.面试回答 Spring管理的Controller,即加入@Controller 注入的类,默认是单例的,因此建议: 1.不要在Controller 中定义成员变量:(单例非线程安全,会导致属性重复使用) 2.若必须要在Controller 中定义一个非静态成员变量,则通过注解@Scope("prototype"),将其设置为多

  • Spring中单例和多例的深入理解

    Spring单例和多例的理解 1.什么是单例和多例 单例:所有请求用同一个对象来处理.通过单例模式,可以保证系统中一个类只有一个实例. 多例:每个请求用一个新的对象来处理. 2.Spring中的单例与多例 spring ioc容器的bean都是默认单例的,即spring依赖注入Bean实例默认是单例的. spring提供了5中scope,分别是singleton,prototype,request,session,global session,常用是前两种.点此查看官网介绍. 单例bean与多例

  • spring单例如何改多例

    目录 spring单例改多例 附加自己待测试 spring单例.多例使用方法 spring支持的模式 扩展模式 spring单例改多例 单例:就像你一生只有一个老婆.也就是对象始终是同一个. 多例:就像你一生有好多个老婆.也就是对象每次都是新的. spring默认是单例模式(就每个请求都是用的同一对象,对于dao层肯定是棒棒的),但是有的时候,我们需要每个请求都 产生一个新的对象,就如做微信小程序,用scoket.不可能一直都用一个来接收的,因为需要分配房间,所以需要使用到多例. 对于strut

  • 通过spring注解开发,简单测试单例和多例区别

    目录 通过spring注解开发,测试单例和多例区别 1.注解和配置两种用法形式 2.在spring框架中,scope作用域默认是单例的 3.实例 (1)多例: (2)单例(注解版) Spring中单例和多例的理解 1.什么是单例和多例 2.Spring中的单例与多例 单例bean与多例(原型)bean的区别: 3.单例的优势与劣势 优势: 劣势: 4.spring单例模式与线程安全: 如何解决线程安全问题? 5.单例如何变多例 通过spring注解开发,测试单例和多例区别 1.注解和配置两种用法

  • Struts中的Action 单例与多例详解

     Struts中的Action 单例与多例详解 struts2中action是多例的,即每次访问网络地址的时候都会产生一个action public class pr_action { public pr_action(){ System.out.println("创建action成功!!!"); } public void execute(){ } } 运行代码可以看到,每次访问该网络地址都会在控制台输出一次!!! 如果是单例的话,若出现两个用户都修改一个对象的属性值,则会因为用户修

  • 浅谈Spring Bean的基本配置

    一.Spring中set方法的注入 User实体 @Data //lombok提供的有参构造 @AllArgsConstructor lombok提供的无参构造 @NoArgsConstructor public class User { private int id; private String name; private int age; private String sex; private String birthday; } beanFactory.xml <bean id="

随机推荐