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