ATG 中的依赖注入是如何工作的?
How does dependency injection work in ATG?
我是 ATG 的新手,想了解基本的 concepts.I 阅读了很多关于它的文章,但我仍然不清楚这个概念。
ATG DI 模型使用 Nucleus 来管理对象图,每个可注入的 bean 都需要配置为 Nucleus 组件。
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)
方法)
我是 ATG 的新手,想了解基本的 concepts.I 阅读了很多关于它的文章,但我仍然不清楚这个概念。
ATG DI 模型使用 Nucleus 来管理对象图,每个可注入的 bean 都需要配置为 Nucleus 组件。
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)
方法)