Bean作用域的种类(Singleton和Prototype的主要区别)

Bean的七大作用域

  1. singleton:唯一bean实例,Spring中的bean默认都是单例的。
  2. prototype:每次请求都会创建一个新的bean实例。
  3. request:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP Request内有效。
  4. session:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP Session内有效。
  5. global-session:全局session作用域,仅仅在基于portlet的web应用中才有意义,Spring5已经没有了。 Portlet是能够生成语义代码(例如:HTML)片段的小型JavaWeb插件。 它们基于portlet容器,可以像servlet一样处理HTTP请求。 但是,与servlet不同,每个portlet都有不同的会话。
  6. application:为每个ServletContext对象创建一个实例,仅在Web相关的ApplicationContext中有效
  7. 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的区别

  1. 问:如果employee使用了scope=“prototype”,而employeeDao还是单例,同时获取两个bena会是什么情况? 答:使用getBean的话,employee是不同的,employeeDao是相同的。用不同的employeeDao调用getEmployee得到的employee是相同的,因为employeeDao是单例,所以就算getBean使用了两次,得到的还是同一个employeeDao
  2. 问:如果employeeDao使用了scope=“prototype”,而employee还是单例,同时获取两个bena会是什么情况?
  3. 问:如果employee和Dao都使用了scope=“prototype”,同时获取两个bena会是什么情况? 答:employee各不相同,通过Dao获取的employee不相同,Dao也不相同
  4. 全singleton情况
经验分享 程序员 微信小程序 职场和发展