Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Spring中检查请求范围bean的类型?_Java_Spring - Fatal编程技术网

Java 如何在Spring中检查请求范围bean的类型?

Java 如何在Spring中检查请求范围bean的类型?,java,spring,Java,Spring,我正在尝试编写一个Junit测试,以确保其他测试的配置类设置正确。在这个测试期间,我想检查设置的bean是真实实现还是虚拟实现。然而,我在尝试验证请求范围bean的类型时遇到了一个问题 当我像这样设置bean时: @Bean public MyBeanAI myBeanAI() { return new MyBeanA(); } @Bean @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedPro

我正在尝试编写一个Junit测试,以确保其他测试的配置类设置正确。在这个测试期间,我想检查设置的bean是真实实现还是虚拟实现。然而,我在尝试验证请求范围bean的类型时遇到了一个问题

当我像这样设置bean时:

@Bean
public MyBeanAI myBeanAI() {
    return new MyBeanA();
}

@Bean
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public MyBeanBI myBeanBI() {
    return new MyBeanB();
}
在测试代码中:

Assert.assertTrue(myBeanAI instanceof MyBeanA);  // Succeeds
Assert.assertTrue(myBeanBI instanceof MyBeanB);  // Fails
检查请求范围bean的实现类型的最佳方法是什么?我尝试了
.isAssignableFrom()
,但它产生了相同的结果。我现在看到的唯一方法是使用
myBeanB.toString()
,如果它没有在我的类中被重写,代理将打印出基类型的名称
bean.getClass()
但是返回
com.sun.proxy.$Proxy44

关于SO()还有一个类似的问题,它也希望获得关于代理后面的类的信息,但是问题和答案只处理作为bean定义的返回类型的class对象。在我的例子中,我不需要关于用于创建bean的接口的信息,而是需要它背后的实际实现。幸运的是,在那个问题上指出的相同API提供了另一种适合我需要的方法


我将自己补充一个答案。感谢David Lavender在评论中指出的另一个问题

正如David Lavender在评论中指出的那样,还有一个类似的问题涉及在()获取代理背后的类。使用
建议的
目标源
接口的其他方法,也可以获得代理背后的确切实现:

Assert.assertTrue(((Advised) myBeanBI).getTargetSource().getTarget() instanceof MyBeanB);
请注意,在另一个问题中使用的方法允许获取代理bean后面的接口

Assert.assertTrue(((Advised) myBeanBI).getTargetSource().getTargetClass().equals(MyBeanBI.class));

正如David Lavender在评论中指出的,有一个类似的问题涉及在()获取代理背后的类。使用
建议的
目标源
接口的其他方法,也可以获得代理背后的确切实现:

Assert.assertTrue(((Advised) myBeanBI).getTargetSource().getTarget() instanceof MyBeanB);
请注意,在另一个问题中使用的方法允许获取代理bean后面的接口

Assert.assertTrue(((Advised) myBeanBI).getTargetSource().getTargetClass().equals(MyBeanBI.class));

请求范围可能重复不是问题。您请求代理模式。所以,当然,春天会给你这样的方式。我不知道你为什么需要测试这个。请求范围可能重复不是问题。您请求代理模式。所以,当然,春天会给你这样的方式。我不知道你为什么要测试这个。