【问题标题】:How does dependency injection work in ATG?依赖注入在 ATG 中是如何工作的?
【发布时间】:2015-10-01 05:53:29
【问题描述】:

我是 ATG 的新手,并试图理解基本概念。我阅读了很多关于它的文章,但我仍然不清楚这个概念。

【问题讨论】:

  • 你读过 ATG 的帮助吗?

标签: atg


【解决方案1】:

这一切都在文档中进行了解释,也在基础基础课程中。

在 ATG 中,您定义“组件”。这些是给定类的命名实例。

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

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

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

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

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

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

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

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

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

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

【讨论】:

  • 感谢您的简单解释。
  • 没问题,@SanchitaDharmadhikary。我相信我在最初的培训课程中就认为你是这样的:)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-13
      • 2014-01-09
      • 1970-01-01
      • 2017-12-23
      • 2015-06-15
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多