java - 运行时通过条件进行依赖注入(inject)

标签 java spring dependency-injection autowired lombok

假设有以下代码:

@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)两个服务,然后在 typeif-else/switch 并相应地选择一个服务。或者将这两项服务放入 Map 中,并以 type 为键。

关于java - 运行时通过条件进行依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36921150/

相关文章:

java - Spring Boot Security 匿名授权

java - 我正在尝试用java制作一个半高效的哈希表,但最终陷入了无限循环

java - 不使用 Spring Security 身份验证?

java - Spring Cloud : Ribbon and HTTPS WITHOUT Eureka

c# - 在 Configure 方法中使用 DependencyInjection

java - 如何在 Grails 中分页?

java - Jackson——递归替换匹配的字段

java - 通过 JSON 中的 RestTemplate 发布请求

scala - 玩框架 2.4、Guice 和 securesocial

java - 将范围与 HttpSessionListener 连接