Инъекция зависимости введение
Давайте сначала рассмотрим концепцию инъекции зависимости:
Инъекция зависимости и инверсия контроля, которую мы часто упоминаем, являются одной и той же концепцией. Конкретное значение: когда роль (возможно, экземпляр Java, вызывающий абонент) нуждается в помощи другой роли (другой экземпляр Java, вызывающий абонент), в традиционном процессе программирования, абонент обычно создается вызывающим абонент. Но весной работа по созданию Callee больше не выполняется вызывающим абонент, поэтому она называется управляющей инверсией; Работа по созданию экземпляра Callee обычно выполняется с помощью пружинного контейнера, а затем вводится в вызывающего абонента, поэтому он также называется инъекцией зависимостей.
Фактически, просто ставят, роль инъекции зависимости состоит в том, чтобы отделить зависимости между объектами из исходного кода и добавить обработку структуры пружинной структуры, чтобы позволить нам гибко и центрально управлять зависимостями.
Структура впрыска зависимости
Структура впрыска зависимости не таинственна, на самом деле это очень простая вещь. Не смотрите на исходный код инъекции зависимости весны, потому что до тех пор, пока вы идете, это означает, что вы никогда больше не будете писать, и вы не осмелитесь начинать самостоятельно. Его функция слишком мощная, поэтому дизайн слишком сложный. Обычные программисты могут только вздохнуть при виде.
Я не читал исходный код весеннего тщательного. Несмотря на это, потребовалось всего полдня, чтобы применить небольшие рамки Iockids, которые в основном соответствуют стандартному стандарту инъекции зависимостей «JSR-330». Эта небольшая структура имеет только один основной инжектор класса с примерно 200 строками кода, и имеет следующие функции.
Давайте посмотрим на немного более сложный пример использования
Импорт javax.inject.inject; import javax.inject.named; import javax.inject.singleton; import iockids.injector; @singletonclass root {@inject @made ("a") Узел A; @Inject @Named ("B") Узел B; @Override public String toString () {return string.format ("root ( %s, %s)", a.name (), b.name ()); }} interface node {string name ();}@singleton@alame ("a") класс Nodea реализует Node {@Inject Leaf; @Inject @Named ("B") Узел B; @Override public String name () {if (b == null) return string.format ("nodea (%s)", лист); else return string.format ("nodeawithb (%s)", лист); }}@Singleton@alame ("b") class nodeb реализует узел {лист лист; @Inject @named ("a") узел a; @Inject public nodeb (лист листа) {this.Leaf = лист; } @Override public String name () {if (a == null) return string.format ("nodeb (%s)", лист); else return string.format ("nodebwitha (%s)", лист); }} класс Leaf {@Inject root root; int index; Статическая последовательность Int; public Leaf () {index = sequence ++; } public String toString () {if (root == null) return "leaf" + index; иначе вернуть "Leafwithroot" + index; }} открытый класс демонстрация {public static void main (string [] args) {var injector = new Injector (); Injector.registerqualifiedClass (node.class, nodea.class); Injector.registerqualifiedclass (node.class, nodeb.class); var root = injector.getInstance (root.class); System.out.println (root); }}Приведенный выше код использует все функции, предоставленные Iockids.
Чтобы облегчить понимание вышеупомянутого кода, я нарисовал диаграмму зависимости
Вышеуказанный вывод кода выглядит следующим образом
root (nodeawithb (Leafwithroot0), Nodebwitha (Leafwithroot1))
Из этого вывода мы также можем приблизительно представить структуру зависимости.
Iockids предоставляет богатые отчеты об ошибках впрыска, чтобы предотвратить ошибки конфигурации впрыска пользователя.
Например, если мы настраиваем имена Nodea и Nodeb выше на одном и том же A, будет выявлена стек ошибок ниже.
iockids.injectexception: дублированный квалифицированный javax.inject.maded с тем же классом iockids.demo.node на iockids.injector.registerqualifiedclass (Injechor.java:87) на iockids.injector.registerqualifiedClass (Injector.java:70) на iockids.demo.demo.main (demo.java:106)
Если мы добавим параметр в конструктор Nodeb по желанию
@Inject public nodeb (лист лист, int k) {this.leaf = лист; }Следующая ошибка будет добавлена при запуске
iockids.injectexception: нет доступного конструктора для класса инъекций int int it yockids.injector.createnew (injector.java:120) на iockids.injector.createnew (Injector.java:94) на iockids.injector.createfromparameter (injector.java:167) iockids.injector.createFromConstructor (Injector.java:145) на iockids.injector.createnew (injector.java:123) на iockids.injector.createfromqualified (injector.java:216) at yockids.createfromfile iockids.injector.injectmembers (Injector.java:233) на iockids.injector.createNew (Injector.java:136) на iockids.injector.createFromqualified (injector.java:216) на iockids.createfrom (injector.Java iockids.injector.injectmembers (Injector.java:233) на iockids.injector.createnew (Injector.java:136) на iockids.injector.createnew (Injector.java:94) на iockids.injector.getstance (injechor.java:245) на at at at at at. iockids.demo.demo.main (demo.java:107)
Проект с открытым исходным кодом: https://github.com/pyloque/iockids (локальная загрузка)
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.