最近討論主要圍繞在公共構造函數以及工廠模式身上
我在此分貼
說說我對 Bean的看法
因為最近項目使用到了webwork
spring
hibernate
我主要結合這些框架來談談我個人對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){
}
this
name=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){
}
this
name=name;
}
public String getNumber(){
}
return number;
}
public void setNumber(String num){
}
number=num;
}
}
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代碼: 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=
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 由C
C
C
等等服務組件構成
每個服務組件又需要調用多個基本服務類來協作
子系統B同樣構架
系統啟動過程 bootrap啟動服務守護引擎
引擎讀取配置文件
相關初始化
服務過程 一個請求上來
守護引擎根據請求映射
需要調用C子系統的服務接口
C子系統的服務接口未裝載
請求beanfactory裝載C子系統的服務接口
beanfactory讀取C系統接口配置
發現這個接口具體實現類
以及這個具體實現類需要到的C
C
C
組件
又根據引用讀取C
等的配置信息
知道最後的服務類是最簡單的POJO bean
逐一初始化所有需要用到的類
然後調用已經實例化的接口
完成服務
改動過程 C
C
組件需要改善功能
增加C
C
組件
寫代碼
編譯打包
修改配置文件
發布
服務過程如上
這個系統是完全可插入的
因為它所有的服務過程都是基於組件的
組件是可裝配的
試想一下
如果其中的C
或者C
不是Bean格式
也就是說沒有公開構造器
那麼這一切優雅的實現就斷節了
就算要實現這麼一個類似的實現
也要需要花費大量的精力物力來填補構造器的模式
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25557.html