Bean作用域:是指Bean在Spring框架中的某种行为模式/可用范围。Spring容器在初始化一个Bean的实例时,同时会指定该实例的作用域。
例如singleton单例模式,就表示Bean在整个Spring中只有一份,它是全局共享的,当其他人修改了这个值,另一个人读取到的就是被修改的值。
Spring中的Bean一共有6种作用域,前两种时core项目和MVC项目都可以用的,后四种是必须基于MVC项目的。即core项目中Bean有两种作用域,MVC项目中Bean有6种作用域。
一、singleton:单例作用域
含义描述:singleton模式下的Bean在IoC容器中只存在一个实例。获取和装配都是同一个对象。
应用场景:属性不需要更新的Bean。
注意:它是Spring中Bean的默认模式
二、prototype:原型作用域
含义描述:原型即原本的状态——多例模式,即每次对该作用域下的Bean请求都会创建新的实例。
应用场景:Bean属性需要更新
三、request:请求作用域
含义描述:与prototype比较像,每次http请求都会创建新的Bean实例。
应用场景:一次http请求和响应共享的Bean,新的轮次不共享
注意:限定web项目/mvc项目使用
四、seesion:回话作用域
含义描述:回话作用域,每次session会话共享一个Bean,比request大
应用场景:用户回话共享的Bean。例如:记录用户的登录信息。
注意:限定web项目/mvc项目使用
五、application:全局作用域(了解即可)
含义描述:一个http servlet Context中,定义一个Bean实例
应用场景:web应用的上下文信息。例如:记录一个应用的共享信息
注意:限定SpringMVC使用
六、websocket:HttpWebSocket作用域(了解即可)
含义描述:一个HTTP WebSocket中,定义一个Bean实例
应用场景:WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直到WebSocket结束都是同⼀个Bean
注意:限定Spring WebSocket中使⽤ 。例如:网页客服
Spring中Bean作用域的设置方式
Bean作用域的设置方式只有一种——使用@Scope标签,但是写法有两种——1.直接设置值2.使用枚举设置。
例如:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
public class Users {
@Scope("prototype")
@Bean(name = "u1")
public User user1() {
User user = new User();
user.setId(1);
user.setName("张三");
return user;
}
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
public class Users {
//ConfigurableBeanFactory.SCOPE.XXXXX
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Bean(name = "u1")
public User user1() {
User user = new User();
user.setId(1);
user.setName("张三");
return user;
}
}
更推荐使用第二种,有提示,不容易写错。切记切记,不要低估自己的马虎心。