Bean对象作用域虽然叫做作用域,但是和代码中的作用域有很大区别,用更易懂的话说,Bean的作用域是Spring容器在注入Bean对象时根据作用域配置来决定注入的Bean对象是共享的还是新创建的。
singleton(单例作用域)
也是Bean对象的默认作用域。
注入策略:
在spring容器中,只有初始化一个这个Bean,注入时,所有地方都注入的这个Bean对象。
使用范围:
整个Spring项目中都能使用。
prototype(多例作用域)
注入策略:
每次注入时,都创建一个Bean实例。
使用范围:
整个Spring项目都能使用。
request(请求作用域)
注入策略:
每个http请求都重新创建Bean对象注入,一次http请求共享Bean
使用范围:
只在Spring web项目中可以使用
session(会话作用域)
注入策略:
不同的Session创建不同Bean,相同的Session共享Bean。
使用范围:
只在Spring web项目中使用
Application(全局作用域)
注入策略:
整个项目范围内,都是共享一个Bean对象。
和singleton的区别是:singleton的Bean对象是spring容器私有的,虽然也是共享一个Bean对象,但是只局限于一个spring容器,如果一个项目有多个spring容器,各个spring容器之间还是独立的Bean对象。
但是Application就是整个项目范围内,所有的Spring容器都共享这一个Bean。
webSocket(网络长连接)
注入策略:
在一个Http WebSocket链接中,共享一个Bean实例
使用范围:
只在Spring webSocket项目中使用
在使用注解将配置Bean对象时,也添加$Scope(“作用域”)来设置每个Bean对象的作用域。
Bean对象的作用域是精确到单个的Bean的,如果不设置,就是默认singleton。
例子:
@Controller(value="User")
@Scope("prototype")
public class User {
@PostConstruct
public void test(){
System.out.println("User的前置方法");
}
@Scope("prototype")
@Bean(name={"users","users2"})
public User getUser(){
return new User();
}
}
还可以使用全局变量来代替自己拼写作用域
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)