bean作用域
Spring的默认所有Spring bean都是单例的。但开发人员可以在bean中添加scope属性来修改默认scope值。
范围 | 描述 |
---|---|
singleton | 每个Spring容器只有一个实例(默认值) |
prototype | bean可以被多次实例化(使用一次就创建一个实例) |
request | bean的scope是HTTP请求。每个HTTP请求都有自己的实例。只有在使用有web功能的Spring上下文时才有效 |
session | bean的scope是HTTP会话。只有在使用有web功能的Spring ApplicationContext时才有效。 |
application | 每个ServletContext有一个实例。 |
websocket | 每个WebSocket有一个实例。只有在使用有web功能的Spring ApplicationContext时才有效。 |
scope定义为singleton时,Spring IoC容器将创建一个由该bean定义的对象实例。该单个实例存储在缓存中,对该bean所有后续请求和引用都将返回缓存中的对象实例。
scope定义为singleton时,Spring IoC容器将在每次对该特定bean进行请求时创建一个新的bean实例。其作用等同于Java的new操作符。
一般,Singleton就可以适用大多数场景了,但某些业务场景(如多线程)需要每次调用生成一个实例,此时scope应设为prototype。
注意: singleton bean引用prototype bean的陷阱。开发人员不能将一个prototype范围的bean注入到自己的singleton bean中,因为这个注入只发生一次,就是当Spring容器正在实例化singleton bean并解析和注入它的依赖时。如果运行时需要多个prototype bean实例,可以采用方法注入的方式,如使用 lookup-method注入或replaced-method注入。
request、session、application和websocket都只有在基于Web的ApplicationContext实现中才能使用。
此外,还可以自定义scope,只要实现springframework.beans.factory.config.Scope接口即可。