Autowire通用bean具有多种实现,但在春季由使用者完全指定

时间:2019-08-23 18:17:09

标签: java spring generics

我最初尝试自动装配以下类和依赖项:

  • @RestController ControllerA(ControllerProxy<A>)@RestController ControllerB(ControllerProxy<B>)
  • @Component ControllerProxy<T>(Converter<T, TTarget>, ProxiedController)
  • @Component ProxiedController()
  • @Component AConverter implements Converter<A, TTarget>@Component BConverter implements Converter<B, TTarget>

Spring抱怨,也许很明显,它不能创建ControllerProxy,因为它期望一个bean但找到了2。对我来说,很明显,只有一个类型可以满足,因为每个{ {1}}用于ConverterA情况,但是显然,这不是Spring和/或Java所看到的。从https://stackoverflow.com/a/50987156/173225我了解到,我某种程度上需要提供每个B的实例,并且它可能与Java实现泛型中的类型擦除有关,尽管答案表明Spring可以通过某种方式获取围绕一些。我已经设法通过显式注册Converter实例来使一切正常工作:

ControllerProxy

但是我宁愿避免这项工作,特别是当我希望其他人能够轻松创建新类型的@Bean ControllerProxy<A> getAProxy(Controller controller) { return new ControllerProxy<A>(new AConverter(), controller); } @Bean ControllerProxy<B> getBProxy(Controller controller) { return new ControllerProxy<B>(new BConverter(), controller); } A而不必为配置烦恼时。在实际的实现中,B是一个websocket端点,Controller是一个帮助程序类,该类允许任何人调用ControllerProxy方法以标准格式将消息发布给订阅者。理想情况下,支持一条新消息所需要做的唯一一件事是:

  1. 创建将使用的任何消息格式转换为标准格式的转换器
  2. 在发布消息的任何代码中都依赖send

理想情况下,所有这些操作都可以在单个ControllerProxy<NewMessageType>中完成,可以将其放入bin文件夹中,并在启动时自动发现并配置。

是否可以在没有手动配置的情况下自动发现并连接正确的bean?

0 个答案:

没有答案