Bean 的作⽤域
❣️关注专栏:JavaEE
之前我们在 Java 中说的作用域是限定程序中变量的可⽤范围,或者说在源代码中定义变量的某个区域就叫做作⽤域。
那么 Bean 的作⽤域是什么呢?接下来看看:
Bean 的作⽤域(默认是单例模式)是指 Bean 在 Spring 整个框架中的某种⾏为模式。该如何理解这个行为模式呢?用singleton 单例作⽤域举个例子:singleton 表示该作⽤域下的 Bean 在 Spring 容器中只存在⼀个实例,并且是全局共享的,也就是说当其他⼈修改了某个值之后,那么另⼀个⼈读取到的就是这个被修改的值。
🍓 1 Bean 的 6 种作⽤域
🍓 1.1 singleton:单例作⽤域(Spring 的默认作用域)
🖖描述:该作⽤域下的Bean在IoC容器中只存在⼀个实例:获取Bean(即通过applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是同⼀个对象。
🖖单例模式是处于对 Spring 框架的性能考虑,当只有是单例模式的时候,就是初始化一次,当每次使用的时候就直接使用已经初始化好的,不用再去初始化了。
🖖适用场景:通常⽆状态的 Bean 使⽤该作⽤域。⽆状态表示 Bean 对象的属性状态不需要更新。如果属性需要更新,那就不能再使用单例模式了。
🍓 1.2 prototype:原型作⽤域(多例作⽤域)
🖖描述:每次对该作⽤域下的Bean的请求都会创建新的实例:获取Bean(即通过
applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是新的对象
实例。
🖖多例模式就意味着,每次处理一个请求都会生成一个 Bean 对象,而新生成一个对象,就要开辟空间,就要初始化,进行响应类的验证......(都是需要时间去执行类加载的)
🖖适用场景:通常有状态的Bean使⽤该作⽤域
🍓 1.3 request:请求作⽤域
🖖描述:每次 http 请求会创建新的 Bean 对象,类似于 prototype
🖖适用场景:⼀次 http 的请求和响应的共享 Bean,限定于 SpringMVC/SpringWeb 中使⽤
🍓 1.4.session:会话作⽤域
🖖描述:在⼀个http session中,定义⼀个 Bean 对象。每次 session 会话共享一个 Bean。
🖖适用场景:⽤户会话的共享 Bean,⽐如:记录⼀个⽤户的登陆信息。限定 SpringMVC/SpringWeb 中使⽤
🍓 1.5.application:全局作⽤域
🖖描述:在⼀个 http servlet Context 中,定义⼀个Bean实例,在同一个 content 中使用的是同一个 bean。下次再创建一个 http servlet Context 来获取 Bean 的时候,就不会是同一个 bean 了,就会新创建一个 Bean 对象了。
🖖适用场景:Web应⽤的上下⽂信息,⽐如:记录⼀个应⽤的共享信息。限定 SpringMVC 中使⽤
🍓 1.6 websocket:HTTP WebSocket 作⽤域
🖖描述:在⼀个 HTTP WebSocket 的⽣命周期中,定义⼀个Bean实例。
🖖适用场景:WebSocket的每次会话中,保存了⼀个 Map 结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直到 WebSocket 结束都是同⼀个Bean。网络长连接,限定于Spring WebSocket中使⽤
🍓 2 设置作⽤域
🍓 2.1 直接设置值:@Scope("prototype")
在 Spring 当中默认是单例模式,如果想要设置某一作用域,就可以使用 @Scope() 来设置。
@Component
public class UserBeans {@Bean@Scope("prototype") // 直接设置值public User user() {User user = new User();user.setId(1);user.setName("张三");return user;}
}
🍓 2.2使⽤枚举设置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class UserBeans {@Bean@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) // 使⽤枚举设置public User user() {User user = new User();user.setId(1);user.setName("张三");return user;}
}