SpringBoot的单例和多例选择
定义
单例
所谓单例就是所有的请求都用一个对象来处理,我们称之为 Full 模式,比如我们常用的 service 和 dao 层的对象通常都是单例的。单例模式中不能有任何私有的变量,不能存在任何有状态的数据,因为单例模式跟静态变量很像,都是全局只有一个。
多例
而多例则指每个请求用一个新的对象来处理,我们称之为 Lite 模式,比如 action。多例模式中可以有私有变量,也要有状态数据,不然也没必要改为多例模式。
当我们需要把一个带有类变量的类放入容器中时,这个类要开启多例模式。
为什么用单例多例
之所以用单例,是因为没必要每个请求都新建一个对象,这样既浪费 CPU 又浪费内存; 之所以用多例,是为了防止并发问题,即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理。
用单例和多例的标准只有一个: 当对象含有可改变的状态时(更精确地说是在实际应用中该状态会改变),或类组件之间无依赖关系用 Lite 模式加速容器启动过程,减少判断,即多例;当类组件之间有依赖关系,方法会被调用得到之前单实例组件时,用 Full 模式,即单例。
实现多例
方法一:scope
注解:
首先在被加入到容器当中的类上打上 @Scope 注解然后传入参数
1
注入:
- 对象工厂(@Scope 中不需要传入 ProxyMode 参数)
- 动态代理,要在被注入的类的 @Scope 注解里面传入一个参数 ProxyModel
方法二:new class
每次请求到来,都new一个对象传递下去处理,避免类变量冲突。
但是,通过new的方式,不属于IOC容器管理,不是一个Bean,类中也不能出现依赖其他Bean的引用,否则初始化将会失败。