Я новичок в ATG и пытаюсь понять основные концепции. Я прочитал много статей об этом, но концепция мне до сих пор не ясна.
Как работает внедрение зависимостей в ATG?
Ответы (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 и многоуровневую конфигурацию.
Все это объясняется в документации, а также в базовом курсе 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)
)
Модель ATG DI использует Nucleus для управления графом объектов, и каждый bean-компонент, который можно вводить, должен быть настроен как компонент Nucleus.