在不实现接口的情况下自动装配包中的所有组件

Autowire all components in a package without implementing an interface

我有一个包含大量服务和存储库的项目。目前每个存储库都使用注释自动连接到服务。

@Service
public class Service1 {
    @Autowired
    private Repository1 repository1;

    @Autowired
    private Repository2 repository2;

    ...100+ more
}

所有这些存储库都在同一个包下。是否可以跳过每个存储库的声明?

我发现一个简单的解决方案是实现如下接口:

@Autowired
private Map<String,RepositoryInterface> repositoryInterface

public void method1(){
    repositoryInterface.get("repository1").doMethod();
}

这应该是一个很好的解决方案,但问题是我无法访问所有源代码。我有大量存储库 classes,不允许我更改以添加接口 class。

请问还有其他方法可以解决吗?就像扫描整个包并使用 bean 名称访问存储库一样?

可以从它们的 class 或它们的名称(以及两者)中检索 Bean。
在您的情况下,您可以直接依赖它们的 class 从上下文中检索它们。

注入一个ApplicationContext(或构造方法):

@Autowired 
private ApplicationContext applicationContext;

并使用它:

applicationContext.getBean(RepositoryOne.class).doMethod1();

理想情况下,它应该被提取到一个方法中:

public <T> T getRepository(Class<T> clazz){ 
   return applicationContext.getBean(clazz);
}

使用起来更简单:

getRepository(RepositoryOne.class).doMethod(1);

但我会警告在 class 中需要如此多的字段依赖项。
这使得 maintain/to 测试变得非常困难,而且使用起来也很容易出错。
最好的办法是重新考虑您的设计以避免这种 complex/bloat class。

除了使用 private Map<String,RepositoryInterface> repositoryInterfaceApplicationContext 之类的结构之外,您将失去 Spring 容器在启动时执行的依赖性检查的好处,该检查可防止 NullPointerException 和相关错误在应用程序工作期间不一致(依赖性缺失)。