<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    org.springframework.beans簡單解讀

    Posted on 2007-04-16 10:23 dennis 閱讀(4080) 評論(1)  編輯  收藏 所屬分類: 源碼解讀
        這個包的說明是說主要是包括用于操作JavaBean的類和接口,將被大部分spring包使用。在讀這個包的代碼前,我特意將JavaBean規(guī)范讀了一遍。JavaBean規(guī)范不僅僅是getter、setter,定義了一個完整的輕量級組件模型,事件、方法、屬性、持久化等等支持均包含在內(nèi)。JavaBean規(guī)范很明顯是學習Delphi的組件模型,sun希望通過它來形成一個java組件的市場,可惜結(jié)果不如人意,JavaBean在GUI方面并未形成一個類似delphi控件市場;隨著spring等輕量級框架的流行,而EJB重量級的組件模型被越來越多的人放棄,JavaBean反而在服務端模型方面占據(jù)了主流 。廢話不提,這個包的核心接口和類就是BeanWrapper和BeanWrapperImpl,顧名思義,這個接口就是用于包裝JavaBean的行為,諸如設置和獲取屬性,設置屬性編輯器等(PropertyEditor)??聪逻@個包的核心類圖:

    BeanWrapper接口繼承了PropertyAccessor(用于屬性訪問和設置)和PropertyEditorRegistry(屬性編輯器的獲取和設置),而BeanWrapperImpl除了實現(xiàn)BeanWrapper接口外還繼承自PropertyEditorRegistrySupport 類。在PropertyEditorRegistrySupport 類中可以看到spring默認設置的一系列自定義PropertyEditor。比如:
    protected void registerDefaultEditors() {
            
    this.defaultEditors = new HashMap(32);

            
    // Simple editors, without parameterization capabilities.
            
    // The JDK does not contain a default editor for any of these target types.
            this.defaultEditors.put(Class.classnew ClassEditor());
            
    this.defaultEditors.put(File.classnew FileEditor());
            
    this.defaultEditors.put(InputStream.classnew InputStreamEditor());
            
    this.defaultEditors.put(Locale.classnew LocaleEditor());
            
    this.defaultEditors.put(Properties.classnew PropertiesEditor());
            
    this.defaultEditors.put(Resource[].classnew ResourceArrayPropertyEditor());
            
    this.defaultEditors.put(String[].classnew StringArrayPropertyEditor());
            
    this.defaultEditors.put(URL.classnew URLEditor());

    。。。。。。。

        PropertyEditor的概念就是屬性編輯器,或者說屬性轉(zhuǎn)換器,比如我們在spring的配置文件中設置某個bean的class,這是一個字符串,怎么轉(zhuǎn)換為一個Class對象呢?通過上面注冊的ClassEditor,看看這個類是怎么實現(xiàn)的:

    public class ClassEditor extends PropertyEditorSupport {

        
    private final ClassLoader classLoader;

        /**
         * Create a default ClassEditor, using the given ClassLoader.
         * 
    @param classLoader the ClassLoader to use
         * (or <code>null</code> for the thread context ClassLoader)
         
    */
        
    public ClassEditor(ClassLoader classLoader) {
            
    this.classLoader =
                    (classLoader 
    != null ? classLoader : Thread.currentThread().getContextClassLoader());
        }


        
    public void setAsText(String text) throws IllegalArgumentException {
            
    if (StringUtils.hasText(text)) {
                
    try {
                    //調(diào)用輔助類,得到Class對象
                    setValue(ClassUtils.forName(text.trim(), 
    this.classLoader));
                }
                
    catch (ClassNotFoundException ex) {
                    
    throw new IllegalArgumentException("Class not found: " + ex.getMessage());
                }
            }
            
    else {
                setValue(
    null);
            }
        }

        
    public String getAsText() {
            Class clazz 
    = (Class) getValue();
            
    if (clazz == null) {
                
    return "";
            }
            
    if (clazz.isArray()) {
                
    return clazz.getComponentType().getName() + ClassUtils.ARRAY_SUFFIX;
            }
            
    else {
                
    return clazz.getName();
            }
        }

    }
        代碼已經(jīng)解釋了一切,繼承javabean的PropertyEditorSupport,自己實現(xiàn)轉(zhuǎn)換即可。這個包另外就是定義了一個完整的異常體系,值的我們參考。另外一個值的注意的地方是CachedIntrospectionResults類的實現(xiàn),這個類使用了單例模式,它的作用在于緩存JavaBean反省(Introspect)得到的信息,因為每次使用Introspector對獲取JavaBean信息是個不小的性能開支。緩存使用的是WeakHashMap,而不是HashMap,看看spring的解釋:
    /**
         * Map keyed by class containing CachedIntrospectionResults.
         * Needs to be a WeakHashMap with WeakReferences as values to allow
         * for proper garbage collection in case of multiple class loaders.
         
    */
        
    private static final Map classCache = Collections.synchronizedMap(new WeakHashMap());

    因為緩存使用的key是bean的Class對象(以保證唯一性),因此在應用存在多個class loaders的時候,為了保證垃圾收集的進行,不出現(xiàn)內(nèi)存泄露而采用WeakHashMap,為了理解這一點,我用JProfiler測試了自定義ClassLoader情況下,內(nèi)存堆的使用情況,從快照上看。在使用HashMap的情況下,因為測試的bean的Class對象被載入它的ClassLoader以及java.beans.BeanInfo,java.beans.PropertyDescriptor,java.lang.reflect.Method這四個對象強引用,而導致不可回收。而在使用WeakHashMap時,判斷當載入bean的ClassLoader和載入CachedIntrospectionResults的ClassLoader是不同的時候,使用弱引用包裝緩存對象,當垃圾收集起發(fā)現(xiàn)弱引用時將馬上清除弱引用對象,該弱引用也將加入一個隊列,而WeakHashMap將定時檢查這個隊列,當有新的弱引用達到時(意味著已經(jīng)被回收)就清除相應的鍵值。請看:
    private static boolean isCacheSafe(Class clazz) {
            
    //CachedIntrospectionResults的ClassLoader
            ClassLoader cur = CachedIntrospectionResults.class.getClassLoader();
            
    //載入bean的ClassLoader
            ClassLoader target = clazz.getClassLoader();
            
    if (target == null || cur == target) {
                
    return true;
            }
            
    while (cur != null) {
                cur 
    = cur.getParent();
                
    if (cur == target) {
                    
    return true;
                }
            }
            
    return false;
        }

    public static CachedIntrospectionResults forClass(Class beanClass) throws BeansException {

       
       
    boolean cacheSafe = isCacheSafe(beanClass);
       
    if (cacheSafe) {
                    classCache.put(beanClass, results);
                }
                
    else {
               //弱引用   
                classCache.put(beanClass, new WeakReference(results));

                }
       

        不知道我的理解是否有誤,如果有誤,請不吝指出,謝謝。


    評論

    # re: org.springframework.beans簡單解讀  回復  更多評論   

    2008-01-16 16:19 by 花生
    你的類圖是用什么畫的?

    可不可以用逆向工程的工具來生成類關系圖呢?
    主站蜘蛛池模板: 日本黄页网站免费| 一个人看的www免费在线视频| 农村寡妇一级毛片免费看视频| 久久久久免费看成人影片| 国产亚洲精品线观看动态图| 亚洲国产高清国产拍精品| 免费中文熟妇在线影片| 久久国产亚洲精品无码| 在线涩涩免费观看国产精品| 亚洲一级特黄大片无码毛片| 亚洲精品日韩一区二区小说| 性短视频在线观看免费不卡流畅| 亚洲av无码乱码国产精品fc2| 成年大片免费高清在线看黄| 国产精品免费视频播放器| 亚洲精品中文字幕无乱码| 久久久久久久岛国免费播放| 亚洲VA中文字幕不卡无码| 成人久久免费网站| 国产成人亚洲精品青草天美| 久久精品免费网站网| 国产L精品国产亚洲区久久| 国产成人人综合亚洲欧美丁香花| 精品国产免费观看一区| 亚洲gay片在线gv网站| 免费理论片51人人看电影| 亚洲av无码专区在线观看下载 | fc2免费人成为视频| jlzzjlzz亚洲乱熟在线播放| 一个人免费播放在线视频看片| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 国产成人无码免费看片软件| 亚洲AV永久精品爱情岛论坛| 亚洲人成免费网站| 无码天堂亚洲国产AV| 亚洲精品色午夜无码专区日韩| 8888四色奇米在线观看免费看| 亚洲AV无码专区在线电影成人| 亚洲日韩涩涩成人午夜私人影院| 在线看片免费人成视久网| 老牛精品亚洲成av人片|