2017-04-10 29 views
1

我正在使用Spring引导。我有一些关于春季引导豆的单身行为的问题。我正在使用单身豆。所以他们每个应用程序只有一个实例。Spring引导类行为

但怀疑我是

一)申请将每个请求或应用程序将所有请求只创建1个实例创建仅1实例?

b)我创建了一个服务&其中一个静态变量。所以现在发生的事情是,在一个请求中,我正在更改另一个请求中的值&,如果我正在获取变量,我正在获取更改的值?这是为什么?

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

d)什么是存储请求特定数据的好方法,例如,可以说,在每个请求我产生交易Id &我想要在10个不同的地方在请求中使用它。那么如何根据请求保存它,或者我必须在每个位置传递它。考虑我每秒有1000个请求。所以很显然,我不能设置类级别的变量,否则值将被重写,因为bean不是线程安全的。

回答

1

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

a)应用程序将只为每个请求创建1个实例OR应用程序将只为所有请求创建1个实例? --->应用程序将只在整个应用程序中创建该类的一次实例,除非另有规定@Scope

b)我已经创建了一个服务&其中一个静态变量。所以现在发生的事情是,在一个请求中,我正在更改另一个请求中的值&,如果我正在获取变量,我正在获取更改的值?这是为什么? --->正如你从我以前的答案中所了解的那样,将只有一个类的实例,并且静态变量的性质在多个调用中共享。因此你看到相同的价值。

c)当变量不是静态的时候也存在同样的行为,只是普通的类变量?这是为什么? --->自当你为一个bean请求(通过@Autowired或其他方式)正被返回给你每次同一个实例,你得到的变量

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

希望它有助于

1

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

a)应用程序将创建一个在所有请求中在整个应用程序中使用的实例。 b)静态变量是类级变量,所以如果一个请求中的值发生了变化,那么它将自动反映到所有其他请求中。

相同的任何其他类级别的变量值将始终保持相同。

C)与B相同)

d)如果可以向用户请求整个一些数据则通过定义类的范围为会话做到这一点。这样你可以保持特定的数据请求。 http://docs.oracle.com/javaee/6/tutorial/doc/gjbbk.html

+0

是否有使用Bean作为会话范围的任何缺点? –

+0

@AnkitBansal我对此不太确定,但是我从您的问题中了解到,您打算一次拨打太多电话,并且如果您在每个会话中保留大量数据,则可能是您想要的情况考虑 –

+0

数据量不是很大,而是有一些数据。太多的电话意味着我正在开发API,它将用于每次有超过1000个用户的网站。 –

相关问题