ATG 中的依赖注入是如何工作的?

How does dependency injection work in ATG?

我是 ATG 的新手,想了解基本的 concepts.I 阅读了很多关于它的文章,但我仍然不清楚这个概念。

ATG DI 模型使用 Nucleus 来管理对象图,每个可注入的 bean 都需要配置为 Nucleus 组件。

勾选http://docs.oracle.com/cd/E52191_03/Platform.11-1/ATGPlatformProgGuide/html/s0201nucleusorganizingjavabeancompone01.html

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 和分层配置进行配置。

这在文档中以及基础基础课程中都有解释。

在 ATG 中,您定义 'components'。这些是给定 class.

命名 实例

您使用 .properties 文件定义这些组件。相对于配置根目录的属性文件的路径和名称成为您的组件的名称。

.properties 文件包含要实例化的 class 的名称

该文件还定义了实例的范围,即一旦实例化,对象是否应该只存在于当前请求、当前会话或应用程序持续时间(全局)

此外,您可以为组件定义任何 属性 值。这些可以按值(特别是对于原始数据类型)或按名称引用另一个组件。

当您启动 ATG EAR 实例时,启动的是 Nucleus。 Nucleus是一个bean容器,负责其中定义的组件的生命周期。

Nucleus 在第一次访问组件时实例化组件。实例化过程如下(大大简化)

  • Nucleus 将通过调用 class 的无参数构造函数来创建对象实例。
  • 组件将被赋予名称,派生自其 .properties 文件位置,并保存在指定的范围内。
  • 然后 Nucleus 将遍历 .properties 文件中定义的所有属性,并调用对象的 setXXX(...) 方法来设置值。
  • 对于值对象(属性文件中的值定义),属性将直接设置。
  • 对于引用对象(由属性文件中 Nucleus 组件的名称定义),将在适当的范围内查找引用的组件,如果存在,则将在 属性.如果引用的组件尚未实例化,则 Nucleus 将首先对该组件进行填充(对该组件执行相同的过程)然后设置该对象将设置在 属性

最后一步是 ATG 如何进行依赖注入。

简而言之,这意味着如果你的classA依赖于classB的一个实例,那么作为开发者,你不写代码来实例化class B,或者查找并绑定到 class B 的实例。只要您满足基本要求[1],您就可以为 class A 编写代码,并隐含假设您将始终获得 class B 的值。然后将 class B 的实例配置为组件,将 class A 的实例配置为组件,然后引用 [=70= class A 的 ] 到 class B 的实例,而 Nucleus 将确保当 class A 中的代码执行时,它已经注入了 [=53 的有效实例=] B.

[1] Class A 和 B 必须有无参数构造函数,class A 必须有一个可写的 属性 类型 B(例如它必须有一个 public void setB(B myB)方法)