??????? 這幾天,閑著無事,看起了spring的源碼,順便也學(xué)習(xí)一下,人家的設(shè)計理念。
??????? spring的源碼還是比較多的,但是區(qū)分的層次比較可以。對比了一下自己設(shè)計的程序,有點慚愧,每次分包的時候,設(shè)計的都比較爛。
??????? 閑話少說,先來看看spring 的核心包beans。
??????? beans 包主要提供了接口和類用于處理java beans。
??????? 其中最主要的接口是BeanWrapper:
??????? Spring 的中心接口,用于訪問javabeans 的低層操作。默認(rèn)實現(xiàn)為BeanWrapperImpl 提供分析和處理標(biāo)準(zhǔn)java beans 用于get 和set 屬性,取得屬性描述,查詢屬性的讀/寫能力。
????用法非常簡單
??? TestBean tb = new TestBean();
????BeanWrapper bw = new BeanWrapperImpl(tb);
??? bw.isReadableProperty("age");//判斷age屬性是否可讀
??? bw.setPropertyValue("name", "tom"); //設(shè)置name屬性的值為tom
??? bw.getPropertyValue("int2")//取得屬性
??? //當(dāng)然,最強大的是能嵌套設(shè)置屬性,如:
??? //tb中有個spouse的屬性,也為TestBean,這樣
?? ?bw.setPropertyValue("spouse.name", "tom");?
????//等價于tb.getSpouse().setName("tom");
??? //bw 同樣支持?jǐn)?shù)組和集合,map屬性設(shè)置
??? bw.getPropertyValue("array[0].name");
??? bw.getPropertyValue("map[key4][0].name");
????
????beans包 還提供了一個PropertyValues用于保存多個屬性值,默認(rèn)的實現(xiàn)MutablePropertyValues
??? MutablePropertyValues pvs = new MutablePropertyValues();
??? pvs.addPropertyValue("array[0].name", "name5");
??? pvs.addPropertyValue("array[1].name", "name4");
??? bw.setPropertyValues(pvs);
???
??? BeanWrapper的層次結(jié)構(gòu),也比較簡單繼承于ConfigurablePropertyAccessor ,而ConfigurablePropertyAccessor 又繼承于PropertyAccessor 和?? PropertyEditorRegistry 接口。
??????? 有一點不太明白,為什么ConfigurablePropertyAccessor 要繼承于PropertyEditorRegistry?
??????? PropertyEditorRegistry 的主要作用是提供方法用于注冊JavaBeans PropertyEditors。默認(rèn)的實現(xiàn)為? PropertyEditorRegistrySupport
??????? 這就使得BeanWrapperImpl 也需要繼承PropertyEditorRegistrySupport,從字面意義上來說,兩個類不是很有關(guān)系,其實最主要用到的方法,也就是registerDefaultEditors(),注冊spring中所有的屬性編輯類。
??????? beans 包中還有兩個接口TypeConverter和Mergeable 。TypeConverter由BeanWrapperImpl實現(xiàn),主要用于轉(zhuǎn)換屬性值。其主要的工作由TypeConverterDelegate 這個包內(nèi)類完成的。Mergeable 主要是用來合并值得,不過具體的實現(xiàn),在org.springframework.beans.factory.support 包中。
??????? beans 包中提供了兩個有用的工具類,BeanUtils和PropertyAccessorUtils。
posted on 2006-09-02 10:10
布衣郎 閱讀(1191)
評論(0) 編輯 收藏 所屬分類:
spring