我试图通过名称找出bean的范围。
到目前为止我发现的是:
BeanFactory#isPrototype(String name)
#isSingleton(String name)
在我的情况下,我想知道bean是否在请求范围内。我可以使用Spring框架中的一些内部方法,但我想知道是否有一个"正确的"这样做的方式。
答案 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范围。