最近讨论主要围绕在公共构造函数以及工厂模式身上。我在此分贴,说说我对 bean的看法。因为最近项目使用到了webwork,spring,hibernate。我主要结合这些框架来谈谈我个人对pojo bean的认识。
bean的规范使得对象属性填充得到动态支持,bean的规范使得对象图的建立非常清晰。ognl正是基于此实现。
在对bean属性赋值 与 bean的定义之间插入一个中间层ognl,得到最大限度的灵活。我们举一个比较极端但确实经常发生的例子(顺带狠狠批一下struts)。
java代码:
1
2 // 持久层entity:
3 public class beana{
...}
4 private string name;
5 private int number;
6 public beana(){
...}
7 }
8 public string getname(){
...}
9return name;
10 }
11 public void setname(string name){
...}
12 this.name=name;
13 }
14 public int getnumber(){
...}
15 return number;
16 }
17 public void setnumber(int num){
...}
18 number=num;
19 }
20 }
21
22 //视图层form:
23 struts:
24 public class beanaform{
...}
25 private string name;
26 private string number;
27 public beana(){
...}
28 }
29 public string getname(){
...}
30 return name;
31 }
32 public void setname(string name){
...}
33 this.name=name;
34 }
35 public string getnumber(){
...}
36 return number;
37 }
38 public void setnumber(string num){
...}
39 number=num;
40 }
41 }
42
struts通过form定义利用bean的特性达到form的自动填充,然后通过beanutil将form转到entity或者dto。
某天,客户觉得需要修改entity,增多一个字段bar,struts的做法是修改form,修改entity,修改配置文件的form定义,修改客户端jsp文件等等,然后编译通过,update database schema。
webwork的做法就非常简单了,在open session in filter模式下,只需改动
entity的定义即可,ognl将所有的问题变得简单得可怕。
ognl完全将客户端到服务器端的参数传递代理了,只要你在你的action定义相应的name setter,ognl自动识别到这个setter,自动将参数传递进来。
对于多层关联的情况,最极端的如下:
java代码:
1
2 public class a{
...}
3 private b b;
4 //getter
5 //setter
6 };
7 public class b{
...}
8 private c c;
9 //getter setter
10 };
11 public class c{
...}
12 string name;
13
14 };
你在视图层只暴露了a对象,而需要通过form修改c对象的值,这种情况在struts我不知道它怎么实现,但是在webwork下,依赖ognl,您要做的仅仅写下这么一句:name="a.b.c.name" 。ognl自动将name的值填充到c的属性。
讨论了这么多,回过头来看,是什么东西使得我们web开发变得简单了呢?是ognl,那么ognl为什么这么强大呢?因为ognl是基于bean的对象图寻找方式!!
到这里,我们看到了bean是一切的基础,没有bean就没有ognl。
同样,看看ioc容器,一样的道理,没有bean就没有ioc容器的实现。如果采用bean的格式定义你的组件, 那么意味着你的组件是可装配的,如果采用bean定义的entity,意味着你的entity是可以自动填充的。
现在评价一个软件好坏,可装配性是一个重要目标。假设一个较复杂得系统,我们分析一下它的运作:
a系统由 子系统c 子系统b 构成,子系统c 由c1,c2,c3等等服务组件构成,每个服务组件又需要调用多个基本服务类来协作。子系统b同样构架。
系统启动过程:
bootrap启动服务守护引擎,引擎读取配置文件,相关初始化。
服务过程:
一个请求上来,守护引擎根据请求映射,需要调用c子系统的服务接口,c子系统的服务接口未装载,请求beanfactory装载c子系统的服务接口,beanfactory读取c系统接口配置,发现这个接口具体实现类,以及这个具体实现类需要到的c1,c2,c3组件,又根据引用读取c1等的配置信息,知道最后的服务类是最简单的pojo bean。逐一初始化所有需要用到的类,然后调用已经实例化的接口,完成服务。
改动过程:
c1,c2组件需要改善功能,增加c4,c5组件。写代码,编译打包,修改配置文件,发布。
服务过程如上
这个系统是完全可插入的,因为它所有的服务过程都是基于组件的,组件是可装配的。试想一下,如果其中的c1或者c2不是bean格式,也就是说没有公开构造器,那么这一切优雅的实现就断节了,就算要实现这么一个类似的实现,也要需要花费大量的精力物力来填补构造器的模式。
闽公网安备 35060202000074号