代码之家  ›  专栏  ›  技术社区  ›  pokken

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

  •  0
  • pokken  · 技术社区  · 7 年前

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

    @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();
    }
    

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

    那么还有别的办法解决这个问题吗?比如扫描整个包,然后使用bean名称访问存储库?

    1 回复  |  直到 7 年前
        1
  •  5
  •   davidxxx    7 年前

    bean可以从它们的类或名称(以及两者)中检索。
    在您的例子中,您可以直接依赖它们的类从上下文中检索它们。

    注入 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);
    

    但是我会警告在一个类中需要这么多的字段依赖项。
    这使得维护/测试非常困难,而且使用时也很容易出错。
    最好的做法是重新考虑您的设计,以避免此类复杂/臃肿的类。

    除了使用类似于 private Map<String,RepositoryInterface> repositoryInterface 应用上下文 将使您失去在启动时由Spring容器执行的依赖性检查的好处 NullPointerException 以及与应用程序工作期间的不一致性(缺少依赖项)相关的错误。