首页 > 解决方案 > 如何在 Spring 中检查请求范围 bean 的类型?

问题描述

我正在尝试编写一个 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( Obtain real Class object for Spring bean )上有一个类似的问题,它也想获取有关代理背后的类的信息,但问题和答案只处理用作bean返回类型的类对象定义。就我而言,我不需要有关用于创建 bean 的接口的信息,而是它背后的实际实现。幸运的是,在那个问题上指出的同一个 API 提供了另一种适合我需要的方法。

我会自己添加一个答案。感谢 David Lavender 在评论中指出另一个问题

标签: javaspring

解决方案


正如 David Lavender 在评论中指出的那样,有一个类似的问题涉及在(获取 Spring bean 的真实类对象)处获取代理背后的类。使用AdvisedTargetSource接口的其他方法,也可以获得代理背后的确切实现:

Assert.assertTrue(((Advised) myBeanBI).getTargetSource().getTarget() instanceof MyBeanB);

请注意,另一个问题中使用的方法允许获取代理 bean 背后的接口。

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

推荐阅读