以下是Spring中原型和请求范围的定义。
原型 将单个bean定义范围限定为任意数量的对象实例。
请求 将单个bean定义范围限定为单个HTTP请求的生命周期;这就是每个HTTP请求都有自己的 在单个bean定义的后面创建的bean实例。仅在Web感知Spring ApplicationContext的上下文中有效。
根据我的理解在原型范围的情况下,一些池将由核心容器维护。它将从该池中提供bean实例。 在请求范围的情况下,将为每个http请求提供新bean。如果理解中有一些相关性,请纠正我吗?
如果以上陈述为真,那么如果bean保持某种状态,则不应将范围定义为原型,而应定义范围 按要求。正确的吗?
答案 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个不同的实例。