最近讨论主要围绕在公共构造函数以及工厂模式身上我在此分贴说说我对 Bean的看法因为最近项目使用到了webworkspringhibernate我主要结合这些框架来谈谈我个人对pojo bean的认识 bean的规范使得对象属性填充得到动态支持Bean的规范使得对象图的建立非常清晰OGNL正是基于此实现 在对bean属性赋值 与 bean的定义之间插入一个中间层OGNL得到最大限度的灵活我们举一个比较极端但确实经常发生的例子(顺带狠狠批一下Struts) java代码:
// 持久层entity: public class BeanA{ } private String name; private int number; public BeanA(){ } } public String getName(){ } return name; } public void setName(String name){ } thisname=name; } public int getNumber(){ } return number; } public void setNumber(int num){ } number=num; } }
//视图层form: Struts: public class BeanAForm{ } private String name; private String number; public BeanA(){ } } public String getName(){ } return name; } public void setName(String name){ } thisname=name; } public String getNumber(){ } return number; } public void setNumber(String num){ } number=num; } }
struts通过form定义利用bean的特性达到form的自动填充然后通过beanutil将form转到entity或者DTO 某天客户觉得需要修改entity增多一个字段barstruts的做法是修改form修改entity修改配置文件的form定义修改客户端jsp文件等等然后编译通过update database schema webwork的做法就非常简单了在open session in filter模式下只需改动 entity的定义即可ognl将所有的问题变得简单得可怕 OGNL完全将客户端到服务器端的参数传递代理了只要你在你的action定义相应的name setterognl自动识别到这个setter自动将参数传递进来 对于多层关联的情况最极端的如下 java代码:
public class A{ } private B b; //getter //setter }; public class B{ } private C c; //getter setter }; public class C{ } String name;
}; 你在视图层只暴露了A对象而需要通过form修改C对象的值这种情况在struts我不知道它怎么实现但是在webwork下依赖OGNL您要做的仅仅写下这么一句name=abcname Ognl自动将name的值填充到c的属性 讨论了这么多回过头来看是什么东西使得我们web开发变得简单了呢?是OGNL那么OGNL为什么这么强大呢?因为OGNL是基于Bean的对象图寻找方式!! 到这里我们看到了Bean是一切的基础没有bean就没有OGNL 同样看看IoC容器一样的道理没有Bean就没有IoC容器的实现如果采用bean的格式定义你的组件 那么意味着你的组件是可装配的如果采用bean定义的entity意味着你的entity是可以自动填充的 现在评价一个软件好坏可装配性是一个重要目标假设一个较复杂得系统我们分析一下它的运作 A系统由 子系统C 子系统B 构成子系统C 由CCC等等服务组件构成每个服务组件又需要调用多个基本服务类来协作子系统B同样构架 系统启动过程 bootrap启动服务守护引擎引擎读取配置文件相关初始化 服务过程 一个请求上来守护引擎根据请求映射需要调用C子系统的服务接口C子系统的服务接口未装载请求beanfactory装载C子系统的服务接口beanfactory读取C系统接口配置发现这个接口具体实现类以及这个具体实现类需要到的CCC组件又根据引用读取C等的配置信息知道最后的服务类是最简单的POJO bean逐一初始化所有需要用到的类然后调用已经实例化的接口完成服务 改动过程 CC组件需要改善功能增加CC组件写代码编译打包修改配置文件发布 服务过程如上 这个系统是完全可插入的因为它所有的服务过程都是基于组件的组件是可装配的试想一下如果其中的C或者C不是Bean格式也就是说没有公开构造器那么这一切优雅的实现就断节了就算要实现这么一个类似的实现也要需要花费大量的精力物力来填补构造器的模式 |