1

例如,如果我有一个 ContainingClass 和 DependencyClass(及其接口):

public class ContainingClass {
    IDependencyClass d;
    public ContainingClass(IDependencyClass d){
        this.d = d;
    }
}

它们已经足够解耦了。此时,显然我们可以使用构造函数将它们连接起来。为什么要在 spring 上下文中定义它们?

各位大佬能说说用spring容器管理bean有什么好处吗?先感谢您。

另外:如果我们过多地使用spring容器,我认为容器的维护和代码的重构会比较困难。不是吗?

4

2 回答 2

1

容器通常用作负责实例化所有对象的顶级实体。它解决了您最终必须解决的问题,即必须将所有对象重新组合在一起并使您的应用程序栩栩如生。

在依赖注入框架出现之前,人们通过使用单独的工厂类来解决这个问题,这些工厂类负责将对象连接在一起。在更大的应用程序中,这导致了许多不必要的样板类,它们除了在一组对象上调用“new”之外什么都不做。Spring 允许您从应用程序中消除这种担忧。

对于非常小的应用程序,您可能不会感到必须构建应用程序的痛苦,并且使用弹簧容器可能是矫枉过正。但是对于较大的应用程序,使用像 spring 这样的容器可以减少样板切割,并且可以更轻松地将应用程序的各个部分连接在一起以进行测试,而无需每次都将完整的应用程序上下文连接在一起。

此外,依赖注入容器鼓励某种编码风格,这通常会导致更可测试的系统,即注入依赖而不是在构造函数中新建它们。这使您可以轻松地将模拟对象替换为数据库连接之类的东西。

对于您的具体问题,答案是您的应用程序中必须存在一些其他类,该类知道如何实例化两者ContainingClass,以及在哪里可以找到IDependencyClass. Spring 可以为你做这件事,或者你必须编写一个自己做的类。

于 2013-08-30T23:29:03.157 回答
0

这里有三点需要考虑:

  1. 首先使用 Spring 有意义吗?对于具有可能类和包的大型 Java Web 应用程序 - 是的(假设您考虑了任何可能的替代方案)。如果它只是几行 Java App - 可能,不。

  2. 一致性。如果项目的其余部分是核心的 Spring 并配置为 XML 中的 bean,那么您可能会坚持这样做。其他事情是怎么做的?您是从头开始并使用 Spring MVC 吗?然后坚持这种模式,您可以在 Spring 文档中看到大量示例。

  3. 你的两个类是如何解耦的。例如,如果您ContainingClass是服务层上的服务,而您IDependencyClass是数据访问层上的 DAO,很可能,我会将它们分开配置并让 Spring 进行注入。特别是,当我计划IDependencyClass在另一个上下文中使用它或使它可以在没有ContainingClass注意到的情况下进行切换(例如,在底层访问层发生变化的情况下)。

此外,考虑使用基于注解的配置,这大大减少了对单独 XML 文件的需求,并且(如果做得好)更容易跟踪代码,因为必须在 XML 和 Java 代码之间切换。

于 2013-08-30T23:51:10.373 回答