Spring - Внедрение зависимостей
Каждое приложение на основе Java имеет несколько объектов, которые работают вместе, чтобы представить то, что конечный пользователь видит как работающее приложение. При написании сложного приложения Java классы приложений должны быть как можно более независимыми от других классов Java, чтобы увеличить возможность повторного использования этих классов и их тестирования независимо от других классов во время модульного тестирования. Инъекция зависимостей (или иногда называемая проводкой) помогает склеивать эти классы вместе и в то же время сохранять их независимость.
Предположим, у вас есть приложение, в котором есть компонент текстового редактора, и вы хотите обеспечить проверку орфографии. Ваш стандартный код будет выглядеть примерно так -
public class TextEditor {
private SpellChecker spellChecker;
public TextEditor() {
spellChecker = new SpellChecker();
}
}
Здесь мы создали зависимость между TextEditor и SpellChecker. В сценарии инверсии управления мы бы вместо этого сделали что-то вроде этого:
public class TextEditor {
private SpellChecker spellChecker;
public TextEditor(SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
}
Здесь TextEditor не должен беспокоиться о реализации SpellChecker. SpellChecker будет реализован независимо и будет предоставлен TextEditor во время создания экземпляра TextEditor. Вся эта процедура контролируется Spring Framework.
Здесь мы удалили полный контроль из TextEditor и оставили его где-то еще (например, файл конфигурации XML), а зависимость (например, класс SpellChecker) вводится в класс TextEditor через Class Constructor. Таким образом, поток управления был «инвертирован» внедрением зависимостей (DI), потому что вы фактически делегировали зависимости какой-то внешней системе.
Второй метод внедрения зависимости - через Setter Methodsкласса TextEditor, в котором мы создадим экземпляр SpellChecker. Этот экземпляр будет использоваться для вызова методов установки для инициализации свойств TextEditor.
Таким образом, DI существует в двух основных вариантах, и в следующих двух разделах мы рассмотрим оба из них с примерами:
Sr.No. | Тип и описание внедрения зависимости |
---|---|
1 | Внедрение зависимостей на основе конструктора DI на основе конструктора выполняется, когда контейнер вызывает конструктор класса с рядом аргументов, каждый из которых представляет зависимость от другого класса. |
2 | Внедрение зависимостей на основе сеттера DI на основе установщика выполняется контейнером, вызывающим методы установщика в ваших bean-компонентах после вызова конструктора без аргументов или статического фабричного метода без аргументов для создания экземпляра вашего bean-компонента. |
Вы можете смешивать как DI на основе конструктора, так и на основе установщика, но это хорошее практическое правило - использовать аргументы конструктора для обязательных зависимостей и установщики для необязательных зависимостей.
Код чище с принципом DI, и разъединение более эффективно, когда объектам предоставляются их зависимости. Объект не ищет свои зависимости и не знает расположение или класс зависимостей, скорее, обо всем позаботится Spring Framework.