代码之家  ›  专栏  ›  技术社区  ›  Robert Munteanu

使用大量bean在依赖注入应用程序中管理复杂性

  •  5
  • Robert Munteanu  · 技术社区  · 15 年前

    我正在开发一个Spring应用程序,它有大量的bean(成百上千个),而且使用和记录起来非常麻烦。

    我对您使用具有大量bean的支持DI的应用程序的任何经验都感兴趣,这些bean将有助于维护、文档和一般使用。

    尽管应用程序是基于Spring的,有几个上下文文件,但我还是愿意听取关于任何DI容器和一般DI的建议。

    4 回复  |  直到 15 年前
        1
  •  4
  •   Brian Agnew    15 年前

    我发现以下是有用的:

    1. 将您的Spring配置拆分为多个独立配置,并使用Spring的导入工具导入配置依赖项(请参见 here 第3.2.2.1节)。这样,您就可以根据需要组合或分解一组配置,它们都是自相关的(所有依赖项都是显式的和引用的)。
    2. 使用一个支持Spring的IDE,并允许您通过点击bean(引用/名称,到源代码和从源代码)来浏览配置。 Intellij 在这方面工作得很好(我想是第7版及以后的版本)。我怀疑Eclipse也会做类似的事情。
    3. 修订 什么 你在注射 哪里 .您可能需要将多个bean注入重构为一个复合bean或“meta”bean,或者更大的组件。或者您可能会发现,您曾经认为需要注入的组件从未改变过,或者从未要求注入能力(用于测试、作为策略实现等)。

    我曾经在一个巨大的弹簧装置上工作过,有几百(数千?)。豆子。拆分配置使生活更易于管理,简化了测试/创建独立进程等。但我认为Intellij附带的Intellij Spring集成带来了最大的不同。拥有一个支持Spring的IDE是一个主要的省时器。

        2
  •  6
  •   Brian Agnew    15 年前

    你可以使用 component scan and autowiring 显著减少SpringXML配置量的特性。

    例子:

    
    <beans>
      <!-- Scans service package looking for @Service annotated beans -->
      <context:component-scan base-package="my.root.package.service"/>
    
    </beans>
    

    为了自动扫描,必须对服务类进行注释:

    
    package my.root.package.service;
    
    

    @Service("fooService") public class FooServiceImpl implements FooService{

    }

    您还可以使用@autowired annotation告诉Spring如何注入bean依赖项:

    
    package my.root.package.service;
    
    @Service("barService")
    public class BarServiceImpl implements BarService{
        //Foo service injected by Spring
        @Autowired
        private FooService fooService;
    
        //...
    }
    
    
        3
  •  3
  •   krosenvold    15 年前

    正如@wilson freitas所说,使用自动布线。我每天都在使用一个系统,这个系统有几千个Spring管理的bean,这些bean大多使用自动连线。但我认为“保留整体形象”的概念有些错位。随着系统的发展,您不能期望像在较小的系统上那样做。使用@autowiring强制您使用比基于XML的Spring更强的类型,这同样意味着您可以使用IDE的依赖跟踪功能来导航依赖项。

    我真的认为认为你 需要 当涉及到弹簧配置时,理解太多的“完整”图片。你应该关注你的代码和它的依赖性。可管理性和可维护性是通过很好地组织代码、很好地命名事物和管理耦合来实现的;即使您不使用Spring,所有适用的东西都是如此。Spring不应该改变太多,并且在JSR-330的批准下,看起来依赖注入会在运行时环境的“引擎盖”下进一步蔓延。

        4
  •  1
  •   Dimitri De Franciscis    15 年前

    我们的战略是:

    • 命名约定 例如:fooservice、foodo、foocontroller;
    • 遵守这些公约的财产设定者;
    • 按名称自动布线 (autowire=“byname”);我们在按类型自动布线方面有很多问题,特别是在控制器层。