如何以编程方式确定 bean 的范围
How to programmatically determine the scope of a bean
我试图通过名称找出 bean 的范围。
目前我发现的是:
BeanFactory#isPrototype(String name)
#isSingleton(String name)
在我的例子中,我想知道bean 是否在请求范围内。我可以使用 Spring 框架中的一些内部方法,但我想知道是否有 "proper" 方法可以做到这一点。
好问题。
BeanFactory
中没有方法 isRequst()
,因为请求范围仅与 Web 相关。
我刚刚尝试找到执行此操作的方法但失败了。因此,如果您使用注释,我可以建议您使用一种解决方法。当你得到 bean 实例时说 bean.getClass().getAnnotation(Scope.class)
。如果这个 returns Scope
调用 value()
.
这不是 "scientific" 方法,但希望对您来说足够好。
编辑
其他方法如下。请求范围 bean 存储在请求属性中。我现在不记得它的名字了,但你可以自己轻松找到它,只需在调试器中检查你的请求即可。然后检查是否存在对您的 bean 的引用。这种方法可能更好,但需要一些努力来调查 Spring 框架使用的请求属性和数据结构。
以下解决方案适用于 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 范围。
我试图通过名称找出 bean 的范围。
目前我发现的是:
BeanFactory#isPrototype(String name)
#isSingleton(String name)
在我的例子中,我想知道bean 是否在请求范围内。我可以使用 Spring 框架中的一些内部方法,但我想知道是否有 "proper" 方法可以做到这一点。
好问题。
BeanFactory
中没有方法 isRequst()
,因为请求范围仅与 Web 相关。
我刚刚尝试找到执行此操作的方法但失败了。因此,如果您使用注释,我可以建议您使用一种解决方法。当你得到 bean 实例时说 bean.getClass().getAnnotation(Scope.class)
。如果这个 returns Scope
调用 value()
.
这不是 "scientific" 方法,但希望对您来说足够好。
编辑
其他方法如下。请求范围 bean 存储在请求属性中。我现在不记得它的名字了,但你可以自己轻松找到它,只需在调试器中检查你的请求即可。然后检查是否存在对您的 bean 的引用。这种方法可能更好,但需要一些努力来调查 Spring 框架使用的请求属性和数据结构。
以下解决方案适用于 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 范围。