Bean的七大作用域
-
singleton:唯一bean实例,Spring中的bean默认都是单例的。
-
prototype:每次请求都会创建一个新的bean实例。
-
request:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP Request内有效。
-
session:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP Session内有效。
-
global-session:全局session作用域,仅仅在基于portlet的web应用中才有意义,Spring5已经没有了。
Portlet是能够生成语义代码(例如:HTML)片段的小型JavaWeb插件。
它们基于portlet容器,可以像servlet一样处理HTTP请求。
但是,与servlet不同,每个portlet都有不同的会话。
-
application:为每个ServletContext对象创建一个实例,仅在Web相关的ApplicationContext中有效
-
werbsocket:为每个websocket对象创建一个实例,仅在Web相关的ApplicationContext中有效
我们主要关注singleton和prototype
singleton
spring的默认作用域,就算不在xml的bean上添加scope=“singleton”,也是默认值。这种scope是从始至终bean都是同一个,容器中只有一个固定的bean,每次获取的都是这个bean
例子:
prototype
这种scope在每次获取bean时都会新建一个bean实例
例子:
下面我们用DI(Employee注入EmployeeDao)试一试singleton和prototype的区别
-
问:如果employee使用了scope=“prototype”,而employeeDao还是单例,同时获取两个bena会是什么情况?
答:使用getBean的话,employee是不同的,employeeDao是相同的。用不同的employeeDao调用getEmployee得到的employee是相同的,因为employeeDao是单例,所以就算getBean使用了两次,得到的还是同一个employeeDao
-
问:如果employeeDao使用了scope=“prototype”,而employee还是单例,同时获取两个bena会是什么情况?
-
问:如果employee和Dao都使用了scope=“prototype”,同时获取两个bena会是什么情况?
答:employee各不相同,通过Dao获取的employee不相同,Dao也不相同
-
全singleton情况