如果依赖注入可以在没有依赖注入的情况下完成,那么JavaSpring中的XMLIOC有什么意义?

如果依赖注入可以在没有依赖注入的情况下完成,那么JavaSpring中的XMLIOC有什么意义?,java,spring,dependency-injection,inversion-of-control,Java,Spring,Dependency Injection,Inversion Of Control,我一直在试着把我的头脑集中在IoC和依赖注入上。我想我已经开始了解在大型应用程序中进行依赖注入的好处了。如果我的理解是正确的,那么当您拥有一致的接口时,依赖注入是有益的,因为您将能够只更改一个实现,而不必更改整个应用程序 我不明白的是XML是从何而来的(我知道现在还有其他IoC方法,比如注释,但除非答案是“XML糟透了,你应该使用注释”,否则我们还是先别说了) 管理以下各项之间的区别是什么: public class MyApp { public static void main(St

我一直在试着把我的头脑集中在IoC和依赖注入上。我想我已经开始了解在大型应用程序中进行依赖注入的好处了。如果我的理解是正确的,那么当您拥有一致的接口时,依赖注入是有益的,因为您将能够只更改一个实现,而不必更改整个应用程序

我不明白的是XML是从何而来的(我知道现在还有其他IoC方法,比如注释,但除非答案是“XML糟透了,你应该使用注释”,否则我们还是先别说了)

管理以下各项之间的区别是什么:

public class MyApp {

    public static void main(String[] args) {

        ItemFinder theQuarterFinder = new QuarterItemFinder();
        FortuneService theFortune = new HappyFortuneService(theQuarterFinder);
        Coach theCoach = new WrestlingCoach(theFortune);

        System.out.println(theCoach.getDailyWorkout());
        System.out.println(theCoach.getDailyFortune());
        System.out.println(theCoach.getItem());


    }

}
并使用xml对其进行管理:

public class HelloSpringApp {

    public static void main(String[] args) {

        //Load spring configuration file
        ClassPathXmlApplicationContext context = 
                new ClassPathXmlApplicationContext("applicationContext.xml");

        //Retrieve bean from spring container

        Coach theCoach = context.getBean("myCoach", Coach.class);

        System.out.println(theCoach.getDailyWorkout());
        System.out.println(theCoach.getDailyFortune());
        System.out.println(theCoach.getItem());

        context.close();
    }

}

如果我要更改itemFinder实现,我将更改完全相同数量的代码,只在XML文件中执行,而不是在主应用程序函数中执行。这真的更可取吗?在XML中查找引用似乎比在MyApp中更改一个“新”调用更难处理


如果我理解正确的话,两个例子都做依赖注入。我们只需将逻辑移出应用程序并放入XML文件。创造了春豆。但是,即使没有XML上下文,我们也在制作bean,对吗

下面是其中一节的摘录,它解释了使用(XML)配置文件的优点和缺点

12.2.1使用配置文件配置容器

当DI容器在21世纪初首次出现时,它们都使用XML作为配置机制——当时大多数情况都是这样。后来将XML作为配置机制的经验表明,这很少是最好的选择

XML往往冗长而脆弱。在XML中配置DI容器时,可以标识各种类和接口,但如果拼写错误,编译器不支持发出警告。即使类名正确,也不能保证所需的程序集将位于应用程序的探测路径中

雪上加霜的是,与普通代码相比,XML的表达能力有限。这有时会使在配置文件中表达某些配置变得困难或不可能,否则这些配置在代码中就很难表达[…]

另一方面,配置文件的优点是,您可以在不重新编译的情况下更改应用程序的行为。如果您开发的软件能够提供给成千上万的客户,这是很有价值的,因为它为他们提供了一种定制应用程序的方法。但是,如果您编写一个内部应用程序或一个控制部署环境的网站,那么在需要更改行为时,重新编译和重新部署应用程序通常会更容易


总而言之:(XML)配置文件(仅)在后期绑定场景中是有价值的,在后期绑定场景中,类型在编译时是未知的,这很可能发生在允许使用插件扩展应用程序时。

您正在进行依赖项注入,但“bean”的魔力您不需要指定那些
构造函数arg
标记;Spring将为您解决依赖性需求。具体如何解决?删除构造函数参数会使整个过程崩溃。您使用的是哪个版本的Spring?5.2.5。我正在学习我的课程,目前我只是在项目文件夹中手动保存jar文件。上面的代码是我仅有的Spring交互。我正在使用XML上下文并从中获取bean。@Akimbo,没错,如果没有XML上下文,您可以使用构造函数args-autowired-,甚至可以编写自己的bean工厂。只要你将上面创建的对象保存在自己的容器中,然后在需要的地方再次获取并使用它们,你可能是对的,关键是“我不想在我的对象需要时一次又一次地构建一个对象,只要给我一个已经构建的对象”,你的类不需要注意创建,其中之一。建造一次,再次使用,摆脱建造成本。
    <bean id="myItemFinder" class="com.luv2code.springdemo.QuarterItemFinder">
    </bean>

    <bean id="myFortune"
        class="com.luv2code.springdemo.HappyFortuneService">
        <constructor-arg ref="myItemFinder" />
    </bean>

    <bean id="myCoach" class="com.luv2code.springdemo.WrestlingCoach">
        <constructor-arg ref="myFortune" />
    </bean>