假设有以下代码:
@RestController
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
class Controller {
/* inject here */
public @NonNull GenericService service;
public void doo(List<GenericDTO> list, String type) {
service.doo(list);
}
}
class GenericDTO { ... }
class GenericService { ... }
class OfferService extends GenericService { ... }
class OtherService extends GenericService { ... }
如果 doo
方法中的 type
等于 "offer"
,我想注入(inject)一个 OfferService
实例到服务
。如果我收到 "other"
,我必须使用 OtherService
,依此类推。这可能吗?
最佳答案
我假设你所有的bean都是单例的。
单例 bean 都是在应用程序启动时发生的上下文初始化期间初始化和注入(inject)的,即。您的 doo
方法(我认为它是一个处理程序方法)尚未被调用。 Spring 无法猜测/知道调用某些方法的可能值是什么,或者这些值应该如何以任何方式影响目标注入(inject)点。
也许代理可以帮助确定在调用 doo
期间要获取什么真实的 bean。这很困难,因为您必须以某种方式将 type
的值暴露给执行解析的任何组件。 Spring 无法开箱即用地做到这一点。您必须编写自己的代码来执行此操作,可能需要借助您自己的 Scope
实现。 (这并非小事。)
最简单的解决方案是注入(inject)两个服务,然后在 type
上if-else
/switch
并相应地选择一个服务。或者将这两项服务放入 Map
中,并以 type
为键。
关于java - 运行时通过条件进行依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36921150/