如何以编程方式确定bean的范围

时间:2015-05-11 09:01:51

标签: java spring scope

我试图通过名称找出bean的范围。

到目前为止我发现的是:

BeanFactory#isPrototype(String name)
           #isSingleton(String name)

在我的情况下,我想知道bean是否在请求范围内。我可以使用Spring框架中的一些内部方法,但我想知道是否有一个"正确的"这样做的方式。

2 个答案:

答案 0 :(得分:4)

好问题。

isRequst()中没有方法BeanFactory,因为请求范围仅适用于网络。

我只是想找到办法做到这一点但失败了。所以,如果你使用注释,我可以建议你一个可行的解决方法。当你获得bean实例时说bean.getClass().getAnnotation(Scope.class)。如果这返回Scope来电value()

这不是"科学"方法,但希望对你来说足够好。

修改

其他方法如下。请求范围bean存储在请求属性中。我现在不记得它的名字,但你可以自己轻松找到它,只需在调试器中检查你的请求。然后检查对bean的引用是否存在。这种方法可能更好,但需要一些努力来研究Spring框架使用的请求属性和数据结构。

答案 1 :(得分:1)

以下解决方案适用于ConfigurableApplicationContext的实例:

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.ConfigurableApplicationContext;

public String getScope(ConfigurableApplicationContext context, String sourceBean) {
    BeanDefinition beanDefinition = context.getBeanFactory().getMergedBeanDefinition(sourceBean);
    return beanDefinition.getScope();
}

通过咨询BeanDefinition,此解决方案也适用于自定义bean范围。