Spring引导类行为

时间:2017-04-10 04:10:04

标签: spring spring-boot

我正在使用Spring启动。我有一些关于spring boot beans的单例行为的问题。我正在使用单身豆。因此,每个应用程序只有一个实例。

但我怀疑是那个

a)应用程序将为每个请求创建一个实例,或者应用程序将为所有请求创建一个实例?

b)我创建了一个Service&一个静态变量。所以现在发生的事情是,在一个请求中,我正在改变价值&在另一个请求中,如果我得到变量,我得到更改的值?那是为什么?

c)当变量不是静态时,也存在同样的行为,只是普通的类变量?那是为什么?

d)另外,存储请求特定数据的好方法是什么?让我们说在每个请求中我生成事务Id&我想在10个不同的地方使用它。那么我如何根据请求保存它,或者我必须在每个地方传递它。考虑我每秒有1000个请求。所以显然我不能设置类级变量,否则每次因为bean不是线程安全的时候都会覆盖值。

2 个答案:

答案 0 :(得分:1)

Singleton类具有在整个应用程序中使用的单个实例。

a)应用程序将只创建一个在所有请求中的整个应用程序中使用的实例。

b)静态变量是类级变量,因此如果在一个请求中更改了值,则会自动反映在所有其他请求中。

对于任何其他类级变量,值始终保持相同。

c)与b)相同

d)如果您可以在整个请求中使用某些数据,那么您可以通过将类的范围定义为会话来实现。这样您就可以保持特定的数据请求。 http://docs.oracle.com/javaee/6/tutorial/doc/gjbbk.html

答案 1 :(得分:1)

一些想法   关于 spring boot beans的单例行为 - >单例行为来自Spring,与springboot不完全相关。

a)应用程序将为每个请求创建一个实例,或者应用程序将为所有请求创建一个实例? ---> 除非@Scope另有说明,否则应用程序将在整个应用程序中仅创建该类的一次实例。

b)我创建了一个服务&一个静态变量。所以现在发生的事情是,在一个请求中,我正在改变价值&在另一个请求中,如果我得到变量,我得到更改的值?那是为什么? ---> 正如您从我之前的回答中理解的那样,该类只有一个实例,并且静态变量本质上是在多个调用之间共享的。因此,您会看到相同的值。

c)当变量不是静态的时候也存在相同的行为,只是正常的类变量?那是为什么? ---> 由于每当您请求bean(通过@Autowired或其他方式)时返回给您的同一个实例,您获得的变量值相同

d)还有什么是存储请求特定的数据的好方法,例如:让我们说在每个请求中我生成事务Id&我想在10个不同的地方使用它。那么我如何根据请求保存它,或者我必须在每个地方传递它。考虑我每秒有1000个请求。显然我不能设置类级别变量,否则每次因为bean不是线程安全的时候都会覆盖值。 ---> 春季项目最大的设计方面之一是确定每个请求将使用哪些部分以及哪些部分可以共享。如果不了解更多细节,将很难评论。但是,根据您的描述,我建议不要将此类设置为Bean并且每次都创建它的实例。无论如何,这些对象的寿命很短(根据请求)并且将被垃圾收集。或者考虑对此bean使用请求scopr @Scope(value="request")

希望有所帮助