Bean作用域的种类(Singleton和Prototype的主要区别)
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情况