📅  最后修改于: 2023-12-03 15:35:03.860000             🧑  作者: Mango
Spring中的Bean范围指的是在Spring容器中创建的Bean的生命周期和作用范围。根据使用场景和需要,Spring提供了不同的Bean范围。
Singleton
是Spring中默认的Bean范围,每个Bean在容器中只会有一个实例。这意味着无论在应用程序中的哪个位置注入这个Bean,都会得到同一个实例。因此,这种范围非常适合那些状态不变的组件,例如工具类或配置类。
@Bean
@Scope("singleton")
public MySingletonBean mySingletonBean() {
return new MySingletonBean();
}
Prototype
是一种可以动态地创建新实例的Bean范围,每次注入时都会创建一个新的实例。这种范围适合那些需要频繁创建和销毁的对象,例如请求作用域的Web组件。
@Bean
@Scope("prototype")
public MyPrototypeBean myPrototypeBean() {
return new MyPrototypeBean();
}
Request
范围的Bean仅在HTTP请求期间存在,并且每个请求都是一个新的实例。这意味着在同一请求中注入的所有Bean都将是相同的实例。这种范围适用于处理HTTP请求的Bean,例如控制器或过滤器。
@Bean
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public MyRequestBean myRequestBean() {
return new MyRequestBean();
}
Session
范围的Bean仅在HTTP会话期间存在,并且每个会话都是一个新的实例。这意味着在同一会话中注入的所有Bean都将是相同的实例。这种范围适用于处理HTTP会话的Bean,例如购物车或用户信息。
@Bean
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public MySessionBean mySessionBean() {
return new MySessionBean();
}
Application
范围的Bean在ServletContext的生命周期内存在,并且每个应用程序都是一个新的实例。这意味着在同一应用程序中注入的所有Bean都将是相同的实例。这种范围适合那些需要全局访问的Bean,例如缓存或全局配置。
@Bean
@Scope(value = "application", proxyMode = ScopedProxyMode.TARGET_CLASS)
public MyApplicationBean myApplicationBean() {
return new MyApplicationBean();
}
WebSocket
范围的Bean仅在WebSocket会话期间存在,并且每个会话都是一个新的实例。这意味着在同一个WebSocket会话中注入的所有Bean都将是相同的实例。这种范围适用于处理WebSocket消息的Bean。
@Bean
@Scope(value = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)
public MyWebSocketBean myWebSocketBean() {
return new MyWebSocketBean();
}
Spring的Bean范围为我们提供了更好的控制和管理Bean的生命周期和使用场景。选择正确的范围可以提高应用程序的性能和可维护性。