前言
Bean对象在Spring的IoC容器中是重要的资源,那么你知道它的作用域是什么吗?你会使用吗?让我们一起来看看~
1.Bean的作用域
我们知道程序中变量的可用范围叫做变量的作用域,那么Bean在Spring中又是IOC容器的重要资源,他的作用域是什么?Bean的作用域就是指Bean在Spring整个框架中的某种行为模式。例如singleton单例作用域,就表示Bean在整个Spring中只有一份,是全局共享的,当有人修改这个值后,那么其他人再读取到的便是修改后的值。
举个栗子,例如在Spring中定义了一个单例Bean对象student,如下:
@Component
public class StudentComponent {
@Bean
public Student student1() {
Student stu = new Student();
stu.setId(1);
stu.setName("林俊杰");
return stu;
}
}
然后在Modify类中通过setName修改了Student,如下代码:
@Controller
public class Modify {
@Autowired
private Student student;
public Student modifyStudent() {
student.setName("周杰伦");
return student;
}
}
最后在Read类中获取Student对象,如下代码:
@Controller
public class Read {
@Autowired
private Student student;
public Student readStudent() {
Student stu = student;
return stu;
}
}
这时我们调用Read类中的readStudent方法就会发现,Student类中原本的name = "林俊杰",变成了“周杰伦”,这就说明Bean对象默认就是单例作用域,在任何地方一旦修改了该单例对象,随后再访问这个对象的时候就是修改之后的对象。
2.作用域类型
Spring 容器在初始化⼀个 Bean 的实例时,同时会指定该实例的作⽤域,作用域类型有如下6种,其中后两种只做了解:
- singleton:单例作用域(默认作用域);
- prototype:原型作用域(多例模式);
- request:请求作用域;
- session:会话作用域(类似多线程中的ThreadLocal);
- application:全局作用域(了解即可);
- websocket:HTTP WebSocket 作⽤域(了解即可)。
注意:在Spring中只有前两种适用,后四种状态是在Spring MVC中适用。
2.1、singleton
- 解释:该作用下的Bean在IOC容器中只有一个实例:获取 Bean(即通过 applicationContext.getBean等方法获取)及装配 Bean(即通过 @Autowired 注入)都是同一个对象。
- 适用场景:该Bean的属性状态不需要更新。
- Ps:Spring默认选择该作用域
2.2、prototype
- 解释:每次都会创建新的实例:获取 Bean(即通过 applicationContext.getBean 等方法获取)及装配 Bean(即通过 @Autowired 注入)都是新的对象实例。
- 适用场景:该Bean的属性状态需要不断更新。
2.3、request
- 解释:每次Http请求都会创建新的Bean实例,类似prototype。
- 适用场景:一次Http的请求和响应共享Bean。
- Ps:限定Spring MVC中使用。
2.4、session
- 解释:在一个Http Session中,定义一个Bean实例。
- 适用场景:用户会话的时候共享 Bean, 比如:记录一个用户的登陆信息。
- Ps:限定Spring MVC中使用。
2.5、application
- 解释:在一个 Http Servlet Context 中,定义一个 Bean 实例。
- 适用场景:Web 应用的上下文信息,比如:记录一个应用的共享信息
- Ps:限定Spring MVC中使用。
2.6、websocket
- 解释:在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bean实例
- 适用场景:WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀ 次初始化后,直到WebSocket结束都是同⼀个Bean。
- Ps:限定Spring WebSocket中使⽤。
3、设置作用域
3.1设置方法
通过@Scope注解就可以设置Bean作用域,分别有以下两种方式:
a)直接设置值,例如:@Scope("prototype"),如下图:
b)设置 ConfigurableBeanFactory 和 WebApplicationContext 提供的 SCOPE_XXX 变量,例如 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE),如下图:
注意:ConfigurableBeanFactory只提供了以下几种:
3.2、对比两种设置方式
上面提到的两种设置方式达到的效果都是一样的, 区别在于直接设置,是建立在你能够记得很清楚,保证不写错的前提下使用的;第二种方法,有IDEA的自动补全,可以保证不出错,这就像是IP地址和域名一样,域名就是方便我们记忆IP地址的一种形式,上述方法中的第二种就是方便记忆的一种方式~
小结
Bean作用域是Bean在Spring中的某种行为模式,常用的作用域是下面的前4种,后两种仅做了解:
1. singleton:单例作⽤域
2. prototype:原型作⽤域(多例作⽤域)
3. request:请求作⽤域
4. session:回话作⽤域
5. application:全局作⽤域
6. websocket:HTTP WebSocket 作⽤域
其中前两种是 spring 核⼼作⽤域,⽽后 4 种是 spring mvc 中的作⽤域,其中 bean 的作⽤域是最重要的知识点也是常⻅的⾯试题,一定要牢记~