@Scope注解的范围可选项
目录
可以给我一个🆓的大拇哥吗?👍😚
Spring Bean 的作用域
Spring 提供了多种作用域,用于控制 Bean 的生命周期和实例化行为。这些作用域包括:
-
singleton(默认)
-
prototype
-
request
-
session
-
application
-
websocket
1. singleton(默认)
定义:singleton
是 Spring 的默认作用域,表示在整个 Spring 容器中只创建一个 Bean 实例。
特点:
-
单例模式:整个应用程序中只有一个实例。
-
线程安全:通常需要确保 Bean 是线程安全的。
示例:
@Component
@Scope("singleton") // 默认作用域,可以省略
public class SingletonBean {
public void doSomething() {
System.out.println("SingletonBean: " + this);
}
}
使用:
@Autowired
private SingletonBean singletonBean;
public void testSingleton() {
singletonBean.doSomething();
}
输出: 每次调用 testSingleton
方法时,都会使用同一个 SingletonBean
实例。
2. prototype
定义:prototype
作用域表示每次请求都会创建一个新的 Bean 实例。
特点:
-
多实例:每次请求都会创建一个新的实例。
-
非线程安全:每个实例都是独立的,不需要考虑线程安全问题。
示例:
java复制
@Component
@Scope("prototype")
public class PrototypeBean {
public void doSomething() {
System.out.println("PrototypeBean: " + this);
}
}
使用:
java复制
@Autowired
private ApplicationContext context;
public void testPrototype() {
PrototypeBean prototypeBean = context.getBean(PrototypeBean.class);
prototypeBean.doSomething();
}
输出: 每次调用 testPrototype
方法时,都会创建一个新的 PrototypeBean
实例。
3. request
定义:request
作用域表示每个 HTTP 请求都会创建一个新的 Bean 实例。
特点:
-
多实例:每个 HTTP 请求都会创建一个新的实例。
-
Web 应用:仅在 Web 应用中有效。
示例:
java复制
@Component
@Scope("request")
public class RequestBean {
public void doSomething() {
System.out.println("RequestBean: " + this);
}
}
使用:
java复制
@Autowired
private RequestBean requestBean;
public void testRequest() {
requestBean.doSomething();
}
输出: 每次 HTTP 请求时,都会创建一个新的 RequestBean
实例。
4. session
定义:session
作用域表示每个 HTTP 会话都会创建一个新的 Bean 实例。
特点:
-
多实例:每个 HTTP 会话都会创建一个新的实例。
-
Web 应用:仅在 Web 应用中有效。
示例:
java复制
@Component
@Scope("session")
public class SessionBean {
public void doSomething() {
System.out.println("SessionBean: " + this);
}
}
使用:
java复制
@Autowired
private SessionBean sessionBean;
public void testSession() {
sessionBean.doSomething();
}
输出: 每个 HTTP 会话中,SessionBean
的实例是唯一的。
5. application
定义:application
作用域表示在整个应用程序中只有一个 Bean 实例。
特点:
-
单例模式:整个应用程序中只有一个实例。
-
线程安全:通常需要确保 Bean 是线程安全的。
-
Web 应用:仅在 Web 应用中有效。
示例:
java复制
@Component
@Scope("application")
public class ApplicationBean {
public void doSomething() {
System.out.println("ApplicationBean: " + this);
}
}
使用:
java复制
@Autowired
private ApplicationBean applicationBean;
public void testApplication() {
applicationBean.doSomething();
}
输出: 整个应用程序中,ApplicationBean
的实例是唯一的。
6. websocket
定义:websocket
作用域表示每个 WebSocket 会话都会创建一个新的 Bean 实例。
特点:
-
多实例:每个 WebSocket 会话都会创建一个新的实例。
-
WebSocket 应用:仅在 WebSocket 应用中有效。
示例:
java复制
@Component
@Scope("websocket")
public class WebSocketBean {
public void doSomething() {
System.out.println("WebSocketBean: " + this);
}
}
使用:
java复制
@Autowired
private WebSocketBean webSocketBean;
public void testWebSocket() {
webSocketBean.doSomething();
}
输出: 每个 WebSocket 会话中,WebSocketBean
的实例是唯一的。
总结
-
singleton
:默认作用域,整个 Spring 容器中只有一个实例。 -
prototype
:每次请求都会创建一个新的实例。 -
request
:每个 HTTP 请求都会创建一个新的实例。 -
session
:每个 HTTP 会话都会创建一个新的实例。 -
application
:整个应用程序中只有一个实例。 -
websocket
:每个 WebSocket 会话都会创建一个新的实例。
可以给我一个🆓的大拇哥吗?👍😚