【发布时间】:2011-11-28 11:31:21
【问题描述】:
我已阅读文档,但没有定义 Dynamic Bean 的主要用途。我了解如何实现这一点,但不知道为什么这种方法这么好。
那么有人能说出什么时候使用 Dynamic Bean 比较好吗?
谢谢
【问题讨论】:
我已阅读文档,但没有定义 Dynamic Bean 的主要用途。我了解如何实现这一点,但不知道为什么这种方法这么好。
那么有人能说出什么时候使用 Dynamic Bean 比较好吗?
谢谢
【问题讨论】:
关于 ATG 中动态 bean 的最有用的部分是为尚未涵盖的类提供额外的 DynamicPropertyMapper 类。首先,请注意,您可以使用 DynamicBeans.setPropertyValue(object, property, value) 和 DynamicBeans.getPropertyValue(object, property) 静态方法来设置或获取对象上不一定与 Java bean 属性对应的属性。如果您使用的对象没有注册动态 bean,它会默认尝试使用 Java bean 属性。提供开箱即用的支持以使用存储库项(属性对应于存储库项属性;自然也适用于 Profile 对象)、DynamoHttpServletRequest 对象(对应于 servlet 参数)、映射/字典(对应于键)和DOM Node 对象(对应于元素属性,后跟 Node 的 getter/setter)。
要为此添加更多类,您需要创建扩展 DynamicPropertyMapper 的类。例如,假设您希望使用回退到 HttpSession 的 getter 和 setter 的属性使 HttpSession 对象以类似方式工作。然后,您将实现 DynamicPropertyMapper 中的三个方法,如果您没有任何自定义 BeanInfo 或 DynamicBeanInfo 类用于您正在为其实现的对象,则可以使用 DynamicBeans.getBeanInfo(object) 轻松实现 getBeanInfo(object) 类.
一旦你有了一个 DynamicPropertyMapper,你就可以用 DynamicBeans.registerPropertyMapper(mapper) 注册它。通常,这将被放入您正在为其编写属性映射器的类的静态初始化块中。但是,如果您要为另一个不受您控制的类(如 HttpSession)创建属性映射器,您将需要创建一个全局范围的通用服务,该服务只需在其 doStartService() 中调用 register 方法。然后您可以将该服务添加到您的初始服务中。
【讨论】:
动态 bean 通常允许您获取和设置可能不是显式成员的字段。最直接的比较是地图 - 地图允许您获取和设置字段而无需事先定义它们。但是,动态 bean 符合标准的 java 习惯用法(getter/setter)。
然而,与 hashmap 不同的是,dyanbeans 可以更容易地实施约束(并且它们隐藏了底层数据结构的实现,因此它们可以是惰性的,或者在设置时建立数据连接等......)。例如,您可以轻松地向您的 dynabean 添加一个显式的 getter 或 setter,并且代码将非常符合地道且清晰地与其他 bean api 交互。
public int getCost()
{
if(this.get("cost")==null)
return -1;
return Integer.parseInt(super.get("cost"));
}
【讨论】: