Как работает внедрение зависимостей в ATG?

Я новичок в ATG и пытаюсь понять основные концепции. Я прочитал много статей об этом, но концепция мне до сих пор не ясна.


atg
person Sanchita Dharmadhikary    schedule 01.10.2015    source источник
comment
Вы хоть читали справку ATG по этому поводу?   -  person bated    schedule 19.11.2015


Ответы (3)


Foo.java

package my.foopackage;
import my.custompackageCustomClass.CustomClass;

public class Foo {

    private CustomClass customClass;

    public void setCustomClass (CustomClass customClass){
        this.customClass = customClass;
    }

    public CustomClass getCustomClass() {
        return customClass;
    }
}

CustomClass.java

package my.custompackageCustomClass;

public class CustomClass {
    private String myProperty;

    public void setMyProperty (CustomClass myProperty){
        this.myProperty = myProperty;
    }

    public CustomClass getMyProperty() {
        return myProperty;
    }
}

Foo.properties

$class=my.foopackage.Foo
$scope=global

customClass=/path/to/configuration/file/ofYourWantedCustomClass/CustomClass

CustomClass.properties

$class=my.custompackageCustomClass.CustomClass
$scope=global

myProperty=myProperty1

Обратите внимание, что у вас может быть несколько файлов свойств для ваших компонентов. например: CustomClass1.properties, CustomClass2.properties и т. д., и у вас могут быть разные значения для String myProperty. Это помогает мне думать, что это второй уровень полиморфизма (на уровне экземпляра), но основное отличие состоит в том, что все компоненты настраиваются через /dyn/admin и многоуровневую конфигурацию.

person Varvarigos Emmanouil    schedule 14.10.2015

Все это объясняется в документации, а также в базовом курсе Foundation.

В ATG вы определяете «компоненты». Это именованные экземпляры данного класса.

Вы определяете эти компоненты с помощью .properties файлов. Путь и имя файла свойств относительно корня конфигурации становятся именем вашего компонента.

Файл .properties содержит имя класса, который будет создан.

Файл также определяет область действия экземпляра, т. е. должен ли объект после создания экземпляра существовать только для текущего запроса, текущего сеанса или продолжительности приложения (глобально).

Кроме того, вы можете определить любые значения свойств для вашего компонента. Это может быть значение (особенно для примитивных типов данных) или ссылка на другой компонент по имени.

Когда вы запускаете экземпляр ATG EAR, запускается именно Nucleus. Nucleus представляет собой контейнер компонентов и отвечает за жизненный цикл определенных в нем компонентов.

Nucleus создает экземпляры компонентов при первом обращении к ним. Процесс создания экземпляра выглядит следующим образом (значительно упрощенный):

  • Nucleus создаст экземпляр объекта, вызвав конструктор класса без аргументов.
  • Компоненту будет присвоено имя, полученное из его расположения в файле .properties, и он будет храниться в указанной области.
  • Затем Nucleus просматривает все свойства, определенные в файле .properties, и вызывает метод setXXX(...) для объекта, чтобы установить значения.
  • Для объектов по значению (определенному значением в файле свойств) свойство будет задано напрямую.
  • Для объектов по ссылке (определяемой по имени компонента Nucleus в файле свойств) указанный компонент будет искаться в соответствующей области видимости, и если он существует, то будет установлен для свойства. Если компонент, на который ссылаются, еще не был создан, то Nucleus сначала наполнит этот компонент (следуя той же процедуре для этого компонента), а затем установит, что объект будет установлен в свойстве

Этот последний шаг — это то, как ATG выполняет внедрение зависимостей.

Короче говоря, это означает, что если ваш класс A имеет зависимость от экземпляра класса B, то как разработчик вы не пишете код для создания экземпляра класса B или для поиска и привязки к экземпляру класса B. Пока вы выполняете базовые требования[1], вы пишете свой код для класса A с неявным предположением, что вам всегда будет даваться значение класса B. Затем вы настраиваете экземпляр класса B как компонент, экземпляр класса B. класс A в качестве компонента, и вы ссылаетесь на свойство класса A на экземпляр класса B, и Nucleus гарантирует, что при выполнении кода в классе A он уже будет внедрен с допустимым экземпляром класса B.

[1] Классы A и B должны иметь конструкторы без аргументов, класс A должен иметь записываемое свойство типа B (например, он должен иметь метод public void setB(B myB))

person Vihung    schedule 26.11.2015
comment
Спасибо за простое объяснение. - person Sanchita Dharmadhikary; 28.11.2015
comment
Нет проблем, @SachitaDharmadhikary. Я уверен, что думал, что вы это в начальном курсе обучения :) - person Vihung; 02.12.2015

Модель ATG DI использует Nucleus для управления графом объектов, и каждый bean-компонент, который можно вводить, должен быть настроен как компонент Nucleus.

Проверьте http://docs.oracle.com/cd/E52191_03/Platform.11-1/ATGPlatformProgGuide/html/s0201nucleusorganizingjavabeancompone01.html

person Santosh Gokak    schedule 02.10.2015