纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

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

hz90s   2021-08-23 我要评论
想了解通过spring注解开发,简单测试单例和多例区别的相关内容吗hz90s在本文为您仔细讲解spring注解测试单例多例区别的相关知识和一些Code实例欢迎阅读和指正我们先划重点:spring注解开发,单例和多例区别下面大家一起来学习吧。

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

1.注解和配置两种用法形式

配置版:

注解版:

2.在spring框架中scope作用域默认是单例的

注:以下测试均是注解版

3.实例

(1)多例:

配置类:

@Configuration
public class PersonConfigure {
     //给容器中注册一个bean类型为返回值的类型id为方法名
   @Scope("prototype") //多例
   @Bean()
   public Person person() {
        System.out.println("bean被加载到容器中");
     return new Person("张三",23);
   }
}

单元测试:

@Test
public void test02() {
     AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(PersonConfigure.class);
     System.out.println("ioc容器加载完成");
     Person bean = (Person) context.getBean("person");
     bean.setName("lisi");
     System.out.println(bean.toString());
     Person bean1 = (Person) context.getBean("person");
     System.out.println(bean1.toString());
     System.out.println(bean==bean1);
}
}

测试结果:

结论:多例情况下容器创建完成时不调用方法创建对象到容器中在程序中获取时才会将对象加载到容器中而且每次调用生成的都是不同的对象。

(2)单例(注解版)

配置类:

//默认是单例
@Configuration
public class PersonConfigure {
     //给容器中注册一个bean类型为返回值的类型id为方法名
   @Bean()
   public Person person() {
    System.out.println("bean被加载到容器中");
     return new Person("张三",23);
   }
}

单元测试:

@Test
public void test02() {
     AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(PersonConfigure.class);
     System.out.println("ioc容器加载完成");
     Person bean = (Person) context.getBean("person");
     bean.setName("lisi");
     System.out.println(bean.toString());
     Person bean1 = (Person) context.getBean("person");
     System.out.println(bean1.toString());
     System.out.println(bean==bean1);
}
}

测试结果:

结论:单例情况下容器创建时调用方法创建对象到容器中在程序中调用bean直接从容器中拿取且每次拿取的都是同一个对象。如果上一次对bean里的属性做了修改那下一次拿取的就是修改过的bean。

Spring中单例和多例的理解

1、什么是单例和多例

单例:所有请求用同一个对象来处理。通过单例模式可以保证系统中一个类只有一个实例。

多例:每个请求用一个新的对象来处理。

2、Spring中的单例与多例

spring ioc容器的bean都是默认单例的即spring依赖注入Bean实例默认是单例的。

spring提供了5中scope分别是singletonprototyperequestsessionglobal session常用是前两种。点此查看官网介绍。

单例bean与多例(原型)bean的区别:

如果一个bean被声明为单例的时候在处理多次请求的时候在spring容器里只实例化出一个bean后续的请求都公用这个对象这个对象会保存在一个map里面。当有请求来的时候会先从缓存(map)里查看有没有有的话直接使用这个对象没有的话才实例化一个新的对象所以这是个单例的。但是对于原型(prototype)bean来说当每次请求来的时候会直接实例化新的bean没有缓存以及缓存查询的过程。

3、单例的优势与劣势

优势:

由于不会创建新的对象所以有以下几个性能上的优势:

减少新生成实例的消耗。新生成实例包括两个方面第一spring会通过反射或者cglib来生成bean实例这都是耗性能的操作。第二给对象分配内存也会涉及负责算法。

减少jvm垃圾回收。由于不会给每个请求都生成bean实例所以回收的对象就少了。

可以快速获取到bean。因为单例获取bean操作除了第一次生成之外其余都是从缓存里获取的所以很快。

劣势:

一个很大的劣势是它不能做到线程安全。由于所有请求都共享一个bean实例那么如果这个bean是一个有状态的bean的话在并发场景下就有可能出现问题。

4、spring单例模式与线程安全:

当多用户同时请求一个服务时容器会给每一个请求分配一个线程这时多个线程会并发执行该请求所对应的业务逻辑(成员方法)此时就要注意了如果该处理逻辑中有对该单例状态的修改(体现为该单例的成员属性)则必须考虑线程同步问题(此时该状态就是一个临界资源(共享数据)如果多个线程同时操作(修改)这个临界资源就会诱发线程安全问题)。

线程安全:如果你的代码所在的进程中有多个线程在同时运行而这些线程可能会同时运行这段代码。如果每次运行的结果和单线程运行的结果是一样的而且其他的变量的值也和预期的是一样的就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多线程之间的切换不会导致该接口的执行结果存在二义性就是线程安全的。

线程安全问题都是由全局变量及静态变量引起的。

若每个线程中对全局变量静态变量只有读操作而无写操作一般来说这个全局变量是线程安全的;若多个线程同时执行写操作一般都需要考虑线程同步否则就可能影响线程安全。

常量始终是线程安全的因为只存在读操作;

每次调用方法前都新建一个实例是线程安全的因为不会访问共享的资源;

局部变量是线程安全的。因为每执行一个方法都会在独立的空间创建局部变量它不是共享资源。局部变量包括方法的参数变量和方法内的变量。

在关于spring单例与线程安全的很多文章中会提到一个概念即有状态bean和无状态bean。

  • 无状态bean:无状态就是一次操作不能保存数据。无状态bean就是没有实例变量的对象不能保存数据是不变类在线程安全的。
  • 有状态bean:有状态就是有数据存储功能。有状态bean就是有实例变量的对象可以保存数据是非线程安全的。

如何解决线程安全问题?

(1)使用线程同步机制:通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的使用同步机制要求程序缜密地分析什么时候对变量进行读写什么时候需要锁定某个对象什么时候释放对象锁等繁杂问题程序设计和编写难度相对较大。

(2)使用ThreadLocal:为每一个线程提供一个独立的变量副本从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本从而也就没有必要对该变量进行同步了。

概括起来就是:对于多线程资源共享的问题同步机制采用了“以时间换空间”的方式而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量让不同的线程排队访问而后者为每一个线程都提供了一份变量因此可以同时访问而互不影响。

5、单例如何变多例

Scope声明为prototype即

@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)

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


相关文章

猜您喜欢

  • jquery全屏滚动 jquery实现全屏滚动效果

    想了解jquery实现全屏滚动效果的相关内容吗最love酸奶在本文为您仔细讲解jquery全屏滚动的相关知识和一些Code实例欢迎阅读和指正我们先划重点:jquery,全屏滚动下面大家一起来学习吧。..
  • JAVA堆排序 JAVA十大排序算法之堆排序详解

    想了解JAVA十大排序算法之堆排序详解的相关内容吗阿粤Ayue在本文为您仔细讲解JAVA堆排序的相关知识和一些Code实例欢迎阅读和指正我们先划重点:JAVA,JAVA堆排序下面大家一起来学习吧。..

网友评论

Copyright 2020 www.Videogametimes.com 【视游时光】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式