春天自动装配的优势是什么?

时间:2013-05-02 17:22:10

标签: spring dependency-injection inversion-of-control autowired

自动装配的优点究竟是什么?春天?

春天自动装配的一个例子就像

public class TestClass {
    testMethod() {
        // .....
    };
}

public class MainClass {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClasspathXmlApplicationContext("test.xml");
        TestMethod obj = (TestClass) ctx.getBean("test");
        obj.testMethod();
    }
}

的test.xml

<bean id="test" class="TestClass">

在正常操作中可以使用以下方法完成:

public class MainClass {
    public static void main(String[] args) {
        TestClass obj = new TestClass();
        obj.testMethod();
    } 
}

Spring的优点是什么,我的意思是我听说过控制和依赖注入的反转术语。 在这两个示例中,TestClass的引用再次通过Spring new oerator通过Spring XML使用。因此,有人可以用简单的术语解释什么是优势。

2 个答案:

答案 0 :(得分:3)

Spring负责创建对象。让我们在春季启动时说你正在创建一项服务:

@Service
public class CreditService { ....

对此你说春季启动,他需要从CreditService类型创建一个对象,无论何时你想使用它,你都不需要创建它你可以说:

@Autowired
private CreditService creditService;

通过这种方式,您将获得一个引用:creditService,它将指向为您创建的spring引导对象并调用方法(服务)。因此,spring基本上是在处理对象的创建而你只是在调用它,而不用担心在任何地方创建新对象。

答案 1 :(得分:0)

根据Spring文档,自动装配具有以下优点

  • 自动装配可以大大减少指定属性或构造函数参数的需要。 (在本章其他地方讨论的其他机制,例如Bean模板,在这方面也很有价值。)
  • 随着对象的发展,自动装配可以更新配置。例如,如果您需要向类中添加依赖项,则无需修改配置即可自动满足该依赖项。因此,在代码库变得更稳定时,自动装配在开发过程中特别有用,而不必忽略切换到显式接线的选择。 当在项目中一致使用自动装配时,自动装配效果最好。如果通常不使用自动装配,则可能使开发人员仅使用自动装配来连接一个或两个bean定义会感到困惑。

考虑自动装配的局限性和缺点:

  • 属性和构造器参数设置中的显式依赖项始终会覆盖自动装配。您无法自动连接简单属性,例如基元,字符串和类(以及此类简单属性的数组)。此限制是设计使然。

  • 自动装配不如显式接线精确。尽管如前所述,Spring还是谨慎地避免猜测,以免产生意想不到的结果。 Spring管理的对象之间的关系不再明确记录。

  • 可能无法从Spring容器生成文档的工具使用接线信息。

  • 容器中的多个bean定义可能与要自动装配的setter方法或构造函数参数指定的类型匹配。对于数组,集合或Map实例,这不一定是问题。但是,对于需要单个值的依赖项,不会任意解决此歧义。如果没有唯一的bean定义可用,则会引发异常。