依赖注入如何在ATG中发挥作用?

时间:2015-10-01 05:53:29

标签: atg

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

3 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

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

首次访问组件时,Nucleus会实例化组件。实例化的过程如下(大大简化)

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

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

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

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

答案 1 :(得分: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和分层配置进行配置。

答案 2 :(得分:1)

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

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