java - 如何在 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 在评论中指出另一个问题
解决方案
正如 David Lavender 在评论中指出的那样,有一个类似的问题涉及在(获取 Spring bean 的真实类对象)处获取代理背后的类。使用Advised
和TargetSource
接口的其他方法,也可以获得代理背后的确切实现:
Assert.assertTrue(((Advised) myBeanBI).getTargetSource().getTarget() instanceof MyBeanB);
请注意,另一个问题中使用的方法允许获取代理 bean 背后的接口。
Assert.assertTrue(((Advised) myBeanBI).getTargetSource().getTargetClass().equals(MyBeanBI.class));
推荐阅读
- javascript - 多个 CPU 内核上的 Node.js CPU 负载平衡 Websocket 客户端
- java - JavaFX 检查是否正在侦听 Node 属性
- docker - docker build IMAGE 导致错误,但 docker-compose up -d 工作正常
- hibernate - Spring Boot with Hibernate Update 对应列
- php - 正则表达式提取php中脚本标签内的内容
- ios - Flutter MLKit:找不到 TensorFlowLiteObjC.modulemap'
- android - 如何在 NestedScrollView 中放置 RecyclerView?
- c++ - 在cpp中的flatbuffers中序列化对象
- php - PHP比较数组值是否具有相同的字符串
- vue.js - 如何将 v-combobox 中的搜索条目与其子组件链接?