Spring Bean六种作用域的适用场景和使用方式
主要对单例作用域与原型作用域进行重点说明,其余四个了解即可
单例(Singleton)作用域:
单例作用域一般是默认的Bean作用域。Spring容器在第一次获取Bean时创建实例,并在后续请求中返回同一个实例。
例如:我们现在创建一个公共的Bean供用户一与用户二使用,用户一再使用完后对其内容进行修改,后被用户二使用,查看Bean是否改变,即可查看Bean的作用域。
公共的Bean:
@Component
public class Users {
private User user;
@Bean
public User user1(){
user= new User(1);
user.setName("zcx");
return user;
}
}用户一使用时进行修改操作:
@Controller
public class BeanScopesController {
@Autowired
private User user;
public User getUser(){
User user1 = user;
System.out.println(user1.toString()+"这是修改之前的");
user1.setName("java");
return user1;
}
}用户二再去使用Bean:
@Controller
public class BeanScopesController2 {
@Autowired
private User user2;
public User getUser2(){
User user = user2;
return user;
}
}打印用户一与用户二共用Bean的值:
public class demo {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
BeanScopesController beanScopesController = context.getBean(BeanScopesController.class);
System.out.println(beanScopesController.getUser().toString()+"这是第一个调用对象修改之后的");
BeanScopesController2 beanScopesController2 = context.getBean(BeanScopesController2.class);
System.out.println(beanScopesController2.getUser2().toString()+"这是第二个对象调用之后的");
}
}进行结果打印:

通过结果我们发现用户一修改过的值在用户二中也出现了,已经不是初始的值了。所以说明Bean 默认情况下是单例状态(singleton),也就是所有用户的使⽤的都是同⼀个对象。
原型(Prototype)作用域:
每次对该作⽤域下的Bean的请求都会创建新的实例:获取Bean(即通过applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是新的对象实例
可以使⽤ @Scope 标签⽤来修改Bean 的作⽤域,例如:
@Component
public class Users {
private User user;
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Bean
public User user1(){
user= new User(1);
user.setName("zcx");
return user;
}
}通过跟前面一样的代码打印结果如下:

通过结果我们知道Bean的作用域已经由单例模式修改为原型模式也就是多例模式当然@Scope 标签有两种设置⽅式:
- 直接设置值:@Scope(“prototype”)
- 使用枚举设置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 请求(Request)作用域:
每次http请求会创建新的Bean实例,类似于prototype,⼀次http的请求和响应的共享Bean,限定SpringMVC中使用
会话(Session)作用域:
在⼀个http session中,定义⼀个Bean实例,⽤户回话的共享Bean,限定SpringMVC中使⽤
全局(application)作用域:
在⼀个http servlet Context中,定义⼀个Bean实例,使用于Web应⽤的上下⽂信息,限定SpringMVC中使⽤
HTTP WebSocket 作用域
在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bean实例,WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直到WebSocket结束都是同⼀个Bean,限定Spring WebSocket中使⽤
到此这篇关于Spring Bean六种作用域的适用场景和使用方式的文章就介绍到这了,更多相关Spring Bean 作用域内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
使用 Spring Boot 内嵌容器 Undertow创建服务器的方法
Undertow是一个非常轻量并高性能的web server,它来自 JBoss。支持blocking和non-blocking两种NIO API。接下来通过本文给大家介绍使用Spring Boot 内嵌容器 Undertow创建服务器的方法,感兴趣的朋友一起看看吧2017-11-11
Spring Boot2中如何优雅地个性化定制Jackson实现示例
这篇文章主要为大家介绍了Spring Boot2中如何优雅地个性化定制Jackson实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-05-05
2020新版idea创建项目没有javaEE 没有Web选项的完美解决方法
这篇文章主要介绍了2020新版idea创建项目没有javaEE 没有Web选项的完美解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-09-09
详解Spring中InitializingBean接口的功能
这篇文章主要介绍了Spring中InitializingBean接口的功能,讲述了spring中InitializingBean接口的功能简介说明,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-05-05


最新评论