Spring请求和原型范围?

时间:2011-06-25 19:24:40

标签: spring

以下是Spring中原型和请求范围的定义。

原型  将单个bean定义范围限定为任意数量的对象实例。

请求  将单个bean定义范围限定为单个HTTP请求的生命周期;这就是每个HTTP请求都有自己的 在单个bean定义的后面创建的bean实例。仅在Web感知Spring ApplicationContext的上下文中有效。

根据我的理解在原型范围的情况下,一些池将由核心容器维护。它将从该池中提供bean实例。 在请求范围的情况下,将为每个http请求提供新bean。如果理解中有一些相关性,请纠正我吗?

如果以上陈述为真,那么如果bean保持某种状态,则不应将范围定义为原型,而应定义范围 按要求。正确的吗?

3 个答案:

答案 0 :(得分:117)

我在网上找到的最好的一个

每次在ApplicationContext上调用getBean时,Prototype都会创建一个全新的实例。而对于Request,只为HttpRequest创建了一个实例。因此,在单个HttpRequest中,我可以在Application上调用两次getBean,并且只会有一个bean实例化,而同一个bean在同一个HttpRequest中作用于Prototype将获得2个不同的实例。

HttpRequest范围

Mark mark1 = context.getBean("mark"); 
Mark mark2 = context.getBean("mark"); 
mark1 == mark2; //This will return true 

原型范围

Mark mark1 = context.getBean("mark"); 
Mark mark2 = context.getBean("mark"); 
mark1 == mark2; //This will return false 

希望能为你清除它。

答案 1 :(得分:19)

你没事了。原型在文档here中描述为

  

“非单身,原型范围   bean部署结果在   每个都创建一个新的bean实例   请求特定bean的请求   是的。“

您对请求范围bean的描述是准确的。

可能只是将电线与原型和单身相交。

答案 2 :(得分:0)

原型范围每次在ApplicationContext上调用getBean方法时都会创建一个新实例。对于请求范围,仅为HttpRequest创建一个实例。

因此,在HttpRequest中,如果在Application上两次调用getBean方法,则只有一个bean被实例化和重用,而在同一个HttpRequest中范围为Prototype的bean将获得2个不同的实例。