何时在Spring应用程序中使用请求,会话,应用程序范围

lea*_*ner 5 spring spring-mvc

我已经通过了5.5 Bean的作用域春季节,我想知道在这里我们使用的范围一些实际的例子request,session以及application范围的Bean.

我已经完成了这篇SO帖子 - > Spring Bean Scopes,但这只是给出了Spring中范围的定义.

有人可以在银行应用程序或任何在线票务预订应用程序或在线购物应用程序中举例说明我们可以使用范围进行请求,会话,应用程序吗?

Ani*_* B. 1

我将逐步解释这一点:

Spring Bean 的范围:

范围 描述
辛格尔顿 每个容器都会创建一个 bean 实例(默认情况下)。
原型 每次请求 bean 时都会创建新实例。
要求 每个 HTTP 请求都会创建一个新的 Bean 实例。
会议 每个 HTTP 会话都有一个新的 Bean 实例。
应用 每个 ServletContext 都会创建一个 bean 实例。
WebSocket 每个 WebSocket 有一个 bean 实例。

带有示例代码的示例:

我创建了五个 bean 来演示所有范围的用例:

单例Bean

@Component
public class SingletonBean {
}
Run Code Online (Sandbox Code Playgroud)

原型Bean

@Component
@Scope("prototype")
public class PrototypeBean {
}
Run Code Online (Sandbox Code Playgroud)

请求Bean

@Component
@RequestScope
public class RequestBean {
}
Run Code Online (Sandbox Code Playgroud)

会话Bean

@Component
@SessionScope
public class SessionBean {
}
Run Code Online (Sandbox Code Playgroud)

应用程序Bean

@Component
@ApplicationScope
public class ApplicationBean {
}
Run Code Online (Sandbox Code Playgroud)

现在,我创建了一个控制器来显示范围的所有行为:

@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>";
    }

}
Run Code Online (Sandbox Code Playgroud)

当您到达端点 - 时http://localhost:8080/dweller/testbeans,您将得到以下输出:

在此输入图像描述

要检查是否创建了具有请求范围的 bean 的新实例,只需刷新/发送新请求即可。

在此输入图像描述

注意:除此之外,还创建了一个具有原型作用域的 bean 的新实例,新实例的哈希码/地址如上面的屏幕截图所示。

要检查是否创建了具有会话范围的 bean 的新实例,只需打开一个隐身窗口,然后单击相同的 url。现在您将看到为具有会话范围的 bean 创建了一个新实例。

在此输入图像描述

要创建单例和应用程序范围 bean 的新实例,您必须重新部署应用程序才能看到更改。

我认为这个解释足以开始任何项目,因为我已经用运行代码解释了基础知识。我建议通过实现所有范围从演示项目(您提到的银行或票据项目)开始。

我添加了一个实时网上银行系统序列图的链接来实现流程。只需了解用例并尝试查看可以在哪里添加范围即可。