我已经浏览了 Spring 中的 5.5 Bean Scopes 部分,我想知道一些实际示例,其中我们使用
request
、session
和 application
作用域 bean 的范围。
我已经阅读了这篇文章 --> Spring Bean Scopes 但这只是给出了 Spring 中范围的定义。
有人可以在银行应用程序或任何在线订票应用程序或在线购物应用程序中举一个例子,我们可以在其中使用请求、会话、应用程序的范围吗?
我将逐步解释这一点:
Spring Bean 的范围:
范围 | 描述 |
---|---|
单例 | 每个容器创建一个 bean 实例(默认情况下)。 |
原型 | 每次请求 bean 时都会创建新实例。 |
请求 | 每个 HTTP 请求都会创建一个新的 bean 实例。 |
会议 | 每个 HTTP 会话都有一个新的 Bean 实例。 |
申请 | 为每个 ServletContext 创建一个 bean 的单个实例。 |
WebSocket | 每个 WebSocket 有一个 bean 实例。 |
带有示例代码的示例:
我创建了五个 bean 来演示所有范围的用例:
SingletonBean:
@Component
public class SingletonBean {
}
PrototypeBean:
@Component
@Scope("prototype")
public class PrototypeBean {
}
RequestBean:
@Component
@RequestScope
public class RequestBean {
}
SessionBean:
@Component
@SessionScope
public class SessionBean {
}
ApplicationBean:
@Component
@ApplicationScope
public class ApplicationBean {
}
现在,我创建了一个控制器来显示范围的所有行为:
@RestController
@Scope("prototype")
public class Resource {
@Autowired
private SingletonBean singletonBean;
@Autowired
private PrototypeBean protoTypeBean;
@Autowired
private RequestBean requestBean;
@Autowired
private SessionBean sessionBean;
@Autowired
private ApplicationBean applicationBean;
@GetMapping("/testbeans")
public String index() {
return "<pre>" + singletonBean + "\n" + protoTypeBean + "\n" + requestBean + "\n" + sessionBean + "\n"
+ applicationBean + "\n" + "</pre>";
}
}
当您到达端点 -
http://localhost:8080/dweller/testbeans
时,您将得到以下输出:
要检查是否创建了具有请求范围的bean的新实例,只需刷新/发送新请求即可。
注意:除此之外,还创建了一个具有原型作用域的bean的新实例,新实例的哈希码/地址显示在上面的屏幕截图中。
要检查是否创建了具有会话范围的 bean 的新实例,只需打开一个隐身窗口,然后单击相同的 url。您现在将看到为具有会话范围的 bean 创建了一个新实例。
要创建单例和应用程序范围 bean 的新实例,您必须重新部署应用程序才能看到更改。
我认为这个解释足以开始任何项目,因为我已经用运行代码解释了基础知识。我建议通过实现所有范围从演示项目(您提到的银行或票务项目)开始。