Понимание необходимости структуры DI - PullRequest
39 голосов
/ 01 февраля 2009

Это может быть наивный вопрос. В настоящее время я изучаю среду Spring и внедрение зависимостей . Хотя базовый принцип DI довольно легко понять, не сразу понятно, зачем вам нужна сложная структура для его реализации.

Рассмотрим следующее:

public abstract class Saw
{
    public abstract void cut(String wood);
}

public class HandSaw extends Saw
{
    public void cut(String wood)
    {
        // chop it up
    }
}

public class ChainSaw extends Saw
{
    public void cut(String wood)
    {
        // chop it a lot faster
    }
}

public class SawMill
{
    private Saw saw;

    public void setSaw(Saw saw)
    {
        this.saw = saw;
    }

    public void run(String wood)
    {
        saw.cut("some wood");
    }
}

Тогда вы можете просто сделать:

Saw saw = new HandSaw();
SawMill sawMill = new SawMill();
sawMill.setSaw(saw);
sawMill.run();

Что будет эквивалентно:

<bean id="saw" class="HandSaw"/>

<bean id="sawMill" class="SawMill">
   <property name="saw" ref="saw"/>
</bean>

плюс:

ApplicationContext context = new ClassPathXmlApplicationContext("sawmill.xml");
SawMill springSawMill = (SawMill)context.getBean("sawMill");
springSawMill.run();

Конечно, это надуманный пример, и с более сложными объектными отношениями может быть более эффективно хранить XML-файл, чем записывать его программно, но, несомненно, в нем должно быть что-то большее?

(Я знаю, что среда Spring - это нечто большее, но я думаю о необходимости контейнера DI.)

В первом примере также было бы тривиально изменить зависимости в середине потока:

// gotta chop it faster
saw = new ChainSaw();
sawMill.setSaw(saw);
sawMill.run();

Ответы [ 12 ]

1 голос
/ 01 февраля 2009

Важно понимать, что Spring - это две вещи, одна из которых построена поверх другой:

  1. Облегченная структура DI / IoC и классы для ее реализации (например, контексты приложения XML и т. Д.); и
  2. Это легкий контейнер .

(2) - основная часть кода Spring. В основном выберите технологию Java, и вы, вероятно, обнаружите, что у Spring есть вспомогательные классы для нее. Это значит, что вы можете использовать ActiveMQ, Sun One MQ или что-либо еще и абстрагировать их как Spring JmsTemplate, что также относится к технологиям доступа к данным, веб-службам и т. Д.

Все эти помощники используют (1), чтобы связать их вместе.

0 голосов
/ 01 февраля 2009

Spring помогает вам понять и даже поддерживает модели DI. Однако я не верю, что у тебя должна быть весна.

У вас могут быть файлы конфигурации на Java, которые вы можете отлаживать, реорганизовывать и выполнять анализ кода.

Я предлагаю вам поместить эти файлы конфигурации Java в другой пакет, но в остальном они эквивалентны файлам конфигурации XML. Вы даже можете загрузить этот файл динамически, если это важно.

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