依赖注入 - 如何改进具有多个参数的构造函数

Cla*_*dix 1 java spring dependency-injection spring-boot

我是 Spring 的新手,最近注意到@Autowired不鼓励在类字段中使用。相反,建议使用构造函数进行依赖注入 (DI)。

问题是我定义了一个需要访问许多存储库的 bean。最初,该 bean 有几个自动装配的字段,保存对这些存储库的引用,但现在我只是删除了注释@Autowired并使用构造函数来初始化它们。结果是一个带有许多参数的构造函数,只要我创建更多存储库/服务,这些参数将来可能会增长:

@Bean
public Syncer syncer(SatBackendApplication.AppParamService appParamService,
                     CustomerRepository customerRepository,
                     AddressRepository addressRepository,
                     ContactPersonRepository contactPersonRepository,
                     CustomerContractRepository customerContractRepository,
                     ProductRepository productRepository,
                     OrderRepository orderRepository,
                     OrderRepository.OrderLineRepository orderLineRepository
                     ) {
    return new Syncer(
            appParamService,
            customerRepository,
            addressRepository,
            contactPersonRepository,
            customerContractRepository,
            productRepository,
            orderRepository,
            orderLineRepository);
}
Run Code Online (Sandbox Code Playgroud)

这是向 bean 注入依赖项的正确方法吗?有没有代码更少的替代解决方案?

Jor*_*orn 5

是的,具有多个参数的构造函数是 DI 的结果。这是一件好事,因为您可以在 DI 之外创建这些对象(例如在测试中),而不会遇到诸如未初始化字段之类的问题。

但是,在生产代码中手动调用这些构造函数并不好。@Bean您根本不需要该方法,只需注释该类Syncer,以便 Spring 可以@Autowire在您需要的地方为您提供它。

还要考虑到,如果您需要那么多依赖项,则可能您的类做得太多了。看看是否可以将其职责分成不同的类。