目录
什么是作用域呢 ?
那什么又是Spring Bean的作用域呢 ?
Spring框架默认Bean作用域是什么呢 ?
Spring Bean的作用域都有哪些呢 ?
如何设置Bean作用域
什么是作用域呢 ?
在JavaSE中,作用域就是指一个变量可生效的范围. 就比如一个变量的作用域是方法的代码块的范围,只在方法内部生效.
那什么又是Spring Bean的作用域呢 ?
我来给一下官方的定义: Spring Bean的作用域是指Bean在整个框架中的某种行为模式.
看着这官方定义是有点懵 啥叫行为模式.
那就在举一个例子 : Singleton是单例作用域,那就是指对于一个Bean,它在整个Spring框架中只存在一份,是全局的共享的,如果要操作这个Bean,所有人都操作这一份Bean.
也就是当一个人将这个Bean被修改了,其他人读取到的就是被修改之后的值.
Spring框架默认Bean作用域是什么呢 ?
我们来实战演练一把,通过这个示例就可以知道Spring默认Bean 作用域是什么了.
有一个Bean为commonBean,假设张三来写一个类来初始化这个Bean然后将Bean存储到Spring中,李四去新创建一个对象来引用这个公共Bean(commonBean),然后使用并修改,王五要使用这个公共的Bean.
commonBean
public class CommonBean {
//创建一个公共的对象供给两个人去使用
private String name;
private int age;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "CommonBean{" +
"name='" + name + '\'' +
", age=" + age +
", id=" + id +
'}';
}
}
张三来写一个类来初始化这个Bean然后将Bean存储到Spring中
@Controller
public class CommonScope {
//公共的类->供给其他人使用
//使用Bean注解将公共类返回的公共Bean存到Spring中
@Bean
public CommonBean doCommonBean(){
CommonBean commonBean = new CommonBean();
commonBean.setName("Java");
commonBean.setAge(19);
commonBean.setId(2000);
return commonBean;
}
}
李四去新创建一个对象来引用这个公共Bean(commonBean),然后使用并修改
@Controller
public class ScopeController1 {
@Autowired
private CommonBean commonBean;
public void doScopeController1() {
//李四自己创建一个对象引用公共的Bean
CommonBean commonBean1 = commonBean;
System.out.println("修改前的数据" + commonBean);
commonBean1.setName("C++");
System.out.println("修改后的数据" + commonBean1);
}
}
王五要使用这个公共的Bean.
@Controller
public class ScopeController2 {
@Autowired
private CommonBean commonBean;
public void doScopeController2(){
System.out.println("使用公共的Bean信息为 : " + commonBean);
}
}
启动类进行使用
public class App {
//启动类
public static void main(String[] args) {
//获取到SpringContext上下文对象
ApplicationContext context1 = new ClassPathXmlApplicationContext
("spring-config.xml");
System.out.println("=================================");
ScopeController1 scopeController1 = context1.getBean("scopeController1", ScopeController1.class);
scopeController1.doScopeController1();
System.out.println("=================================");
ScopeController2 scopeController2 = context1.getBean("scopeController2", ScopeController2.class);
scopeController2.doScopeController2();
}
}
这个时候就会有情况发生我们接下来看运行结果
所以从这里就可以知道Spring框架默认Bean的作用域就是单例作用域.
Spring Bean的作用域都有哪些呢 ?
Spring一共有6种作用域.Spring在为Bean初始化的时候就会设置作用域.
分别为下面6种作用域
- 单例作用域(singleton)
单例作用域是Spring默认的作用域.
单例作用域下 : Bean在SpringIOC容器只存在一个实例,也就是获取Bean(context.getBean())和注入/装配Bean(比如AutoWired注入3)操作Bean的都是同一个Bean
适用场景 : 单例作用域一般适用于无状态的Bean(Bean的状态不需要更新).
- 多例作用域(prototype)
多例作用域也叫原型作用域
对于一个Bean,每次访问这个Bean都会创建新的实例.
也就是在Spring中获取Bean(context.getBean())或者注入Bean(AutoWired注入Bean)操作的这个Bean都是新创建的Bean
适用场景 : 多例作用域一般适用于有状态的Bean(Bean的状态需要更新).
- 请求作用域(request)
在请求作用域下,每次HTTP请求都会创建新的Bean实例.
这个与prototype类似 但是不相同 prototype是每次访问Bean就创建,而request是每次HTTP请求创建新的实例(每次HTTP请求也可能访问多个Bean)
适用场景 : 请求作用域在Spring MVC场景下才能够生效 适用于一次HTTP请求共享Bean
- 会话作用域(session)
在会话作用域下,每次session会话都会创建一个新的实例
适用场景 : 请求作用域在Spring MVC场景下才能够生效,适用于在一次会话共享Bean
- 全局作用域(Application)
在一个Http Servlet Context 中创建一个实例
适用场景 : 请求作用域在Spring MVC场景下才能够生效,适用于Web应用的上下文信息
- WebSocket(了解即可)
在一个HTTP WebSocket的生命周期中,创建新的实例
适用场景 : 请求作用域在Spring MVC场景下才能够生效,WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直到WebSocket结束都是同⼀个Bean
在Bean初始化的时候,就会为Bean设置其作用域.
Spring共有6种作用域
其中单例作用域和多例作用域在Spring框架中使用
请求作用域,会话作用域,全局作用域,WebSocket 只有在SpringMVC框架中才会生效.
如何设置Bean作用域
有两种方式设置Bean的作用域
第一种是直接设置值
比如我们来设置多例作用域
第二种是通过枚举的方式
比如我们来设置多例作用域