Какой смысл XML Io C в Java Spring, если внедрение зависимостей может быть сделано без него? - PullRequest
1 голос
/ 18 апреля 2020

Я пытался обернуть голову вокруг Io C и инъекции зависимости. Я думаю, что начинаю понимать преимущества внедрения зависимостей в большие приложения. Если я правильно понимаю, внедрение зависимостей выгодно, когда у вас есть согласованные интерфейсы, так как вы сможете изменять только реализацию, не меняя всего своего приложения.

Что я не понимаю, так это то, где XML входит во все это (и я знаю, что есть другие методы Io C, такие как аннотации, но если ответ не будет "XML отстой, и вы следует использовать аннотации ", давайте пока не будем go).

В чем разница между управлением этим:

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

}
    <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>

Если бы я изменил Реализация itemFinder, я бы изменил точно такой же объем кода, делая это только в файле XML по сравнению с основной функцией приложения. Это действительно предпочтительнее? Попытка отследить ссылки в XML кажется более сложной, чем просто изменить один из «новых» вызовов в MyApp.

Если я правильно понимаю, оба примера делают внедрение зависимостей. Вы просто перемещаете логи c из приложения в файл XML. и создает бобы весны. Но мы вроде делаем бобы даже без XML контекста, верно?

1 Ответ

2 голосов
/ 18 апреля 2020

Вот выдержка из раздела 12.2.1 из Принципы, практики и шаблоны внедрения зависимостей , в которых объясняются преимущества и недостатки использования (XML) файлов конфигурации.

12.2.1 Настройка контейнеров с помощью файлов конфигурации

Когда DI Containers впервые появились еще в начале 2000-х годов, все они использовали XML как механизм конфигурации - большинство вещей делали тогда. Опыт использования XML в качестве механизма конфигурации позже показал, что это редко лучший вариант.

XML имеет тенденцию быть многословным и хрупким. Когда вы конфигурируете DI-контейнер в XML, вы идентифицируете различные классы и интерфейсы, но у вас нет поддержки компилятора, чтобы предупредить вас, если вы что-то неправильно написали. Даже если имена классов указаны правильно, нет гарантии, что требуемая сборка будет находиться на пути проверки приложения.

Чтобы добавить оскорбление к травме, выразительность XML равна ограничено по сравнению с простым кодом. Это иногда затрудняет или делает невозможным express определенные конфигурации в файле конфигурации, которые в противном случае тривиальны для express в коде [...]

Преимущество файлов конфигурации, с другой стороны, это то, что вы можете изменить поведение приложения без перекомпиляции. Это полезно, если вы разрабатываете программное обеспечение, которое поставляется тысячам клиентов, потому что оно дает им возможность настроить приложение. Но если вы пишете внутреннее приложение или веб-сайт, где вы управляете средой развертывания, часто проще перекомпилировать и повторно развернуть приложение, когда вам нужно изменить поведение.

Подводя итог :( XML) файлы конфигурации (только) полезны в сценарии позднего связывания ios, где типы неизвестны во время компиляции, что, скорее всего, происходит при расширении приложения с помощью плагинов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...