在不实现接口的情况下自动装配包中的所有组件
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> repositoryInterface
或 ApplicationContext
之类的结构之外,您将失去 Spring 容器在启动时执行的依赖性检查的好处,该检查可防止 NullPointerException
和相关错误在应用程序工作期间不一致(依赖性缺失)。
我有一个包含大量服务和存储库的项目。目前每个存储库都使用注释自动连接到服务。
@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> repositoryInterface
或 ApplicationContext
之类的结构之外,您将失去 Spring 容器在启动时执行的依赖性检查的好处,该检查可防止 NullPointerException
和相关错误在应用程序工作期间不一致(依赖性缺失)。