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

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

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

    Chan Chen Coding...

    Netty 4.0 源碼分析(七):AbstractBootstrap抽象類

    AbstractBootstrap是一個(gè)幫助類,通過方法鏈(method chaining)的方式,提供了一個(gè)簡(jiǎn)單易用的方式來配置Bootstrap,然后啟動(dòng)一個(gè)Channel。在理解Netty源碼中的AbstractBootstrap ServerBootstrapBootstrap之前,應(yīng)該先了解一下什么是method chaining


    Wiki
    上面對(duì)于method chaining的定義如下:

    Method chaining, is a common technique for invoking multiple method calls in object-oriented programming languages. Each method returns an object (possibly the current object itself), allowing the calls to be chained together in a single statement.

    在面向?qū)ο蟮木幊陶Z言中,method chaining是一種用于調(diào)用多個(gè)方法的常用技術(shù)。每個(gè)方法都會(huì)返回一個(gè)對(duì)象(可能是當(dāng)前對(duì)象本身),這樣做的好處就是,通過一條語句,就可以講所有的方法調(diào)用鏈接在一起。 


    定義有一些抽象,那么可以通過實(shí)際的例子來進(jìn)行理解和消化。

    假設(shè)有一個(gè)StringBuffer的類,類中有一個(gè)append()方法

    public class StringBuffer {
      public void append(String str) {
        //  useful code 
      }
    }

     

    這個(gè)類有缺點(diǎn)就是說,在向StringBuffer對(duì)象追加新的字符串的時(shí)候,需要在多條語句中,不斷的調(diào)用append()方法。

    StringBuffer sb = new StringBuffer();
    sb.append("Hello ");
    sb.append(name);
    sb.append("! Welcome!");

    method chaining的實(shí)現(xiàn),就可以避免這個(gè)缺陷。

    public class StringBuffer {
      public StringBuffer append(String str) {
        //  useful code 
        return this;
      }
    }

    現(xiàn)在我們就可以再一條語句中實(shí)現(xiàn)第一個(gè)例子的功能了。

    StringBuffer sb = new StringBuffer();
    sb.append("Hello ").append(name).append("! Welcome!");


    AbstractBootstrap
    抽象類 (部分代碼)

    package io.netty.bootstrap;
     
    public abstract class AbstractBootstrap<B extends AbstractBootstrap<?>> {
        private EventLoopGroup group;
        private ChannelFactory factory;
        private SocketAddress localAddress;
        private final Map<ChannelOption<?>, Object> options = new LinkedHashMap<ChannelOption<?>, Object>();
        private final Map<AttributeKey<?>, Object> attrs = new LinkedHashMap<AttributeKey<?>, Object>();
    private ChannelHandler handler;
     
        @SuppressWarnings("unchecked")
        public B group(EventLoopGroup group) {
            if (group == null) {
                throw new NullPointerException("group");
            }
            if (this.group != null) {
                throw new IllegalStateException("group set already");
            }
            this.group = group;
            return (B) this;
        }
        public B channel(Class<? extends Channel> channelClass) {
            if (channelClass == null) {
                throw new NullPointerException("channelClass");
            }
            return channelFactory(new BootstrapChannelFactory(channelClass));
        }
        @SuppressWarnings("unchecked")
        public B channelFactory(ChannelFactory factory) {
            if (factory == null) {
                throw new NullPointerException("factory");
            }
            if (this.factory != null) {
                throw new IllegalStateException("factory set already");
            }
            this.factory = factory;
            return (B) this;
        }
        @SuppressWarnings("unchecked")
        public B localAddress(SocketAddress localAddress) {
            this.localAddress = localAddress;
            return (B) this;
        }
        @SuppressWarnings("unchecked")
        public <T> B option(ChannelOption<T> option, T value) {
            if (option == null) {
                throw new NullPointerException("option");
            }
            if (value == null) {
                options.remove(option);
            } else {
                options.put(option, value);
            }
            return (B) this;
        }
        public <T> B attr(AttributeKey<T> key, T value) {
            if (key == null) {
                throw new NullPointerException("key");
            }
            if (value == null) {
                attrs.remove(key);
            } else {
                attrs.put(key, value);
            }
            return (B) this;
        }
        @SuppressWarnings("unchecked")
        public B handler(ChannelHandler handler) {
            if (handler == null) {
                throw new NullPointerException("handler");
            }
            this.handler = handler;
            return (B) this;
        }
    }

     

     

    AbstractBootstrap聲明了六個(gè)私有的成員變量,EventLoopGroup對(duì)象,ChannelFacotry對(duì)象,SockteAddress對(duì)象,Map<ChannelOption<?>,Object>對(duì)象,Map<Attribute<?>,Object>對(duì)象,ChannelHandler對(duì)象。并且有相對(duì)應(yīng)的方法,來設(shè)置這些對(duì)象,如

    public B group(EventLoopGroup group) {
            if (group == null) {
                throw new NullPointerException("group");
            }
            if (this.group != null) {
                throw new IllegalStateException("group set already");
            }
            this.group = group;
            return (B) this;
    }

     

    通過傳進(jìn)來的group對(duì)象,然后將AbstractBootstrap中的group指向傳進(jìn)來的group。最終返回的還是AbstractBootstrap這個(gè)當(dāng)前對(duì)象。

     

    六個(gè)對(duì)象的作用

    EventLoopGroup group

    用于處理將要被創(chuàng)建的所有event

    ChannelFactory factory

    建立一個(gè)工廠,用于以后的Channel創(chuàng)建

    SocketAddress localAddress;

    用于綁定本地的網(wǎng)絡(luò)地址

    Map<ChannelOption<?>, Object> options

    指定所創(chuàng)建Channel的選項(xiàng),如TCP_NODELAYAIO_READ_TIMEOUT

    Map<AttributeKey<?>, Object> attrs

    指定所創(chuàng)建Channel的屬性

    ChannelHandler handler

    用于處理各類請(qǐng)求

     

    AbstractBootstrap抽象類的接口

     


    AbstractBootstrap抽象類UML

     

    ServerBootstrapBootstrap

    Netty 4.0中,ServerBootstrap用于為服務(wù)器啟動(dòng)ServerChannelBootstrap用于為客服端啟動(dòng)Channel。這兩個(gè)類是AbstractBootstrap的具體實(shí)現(xiàn)。

    備注:因?yàn)楣P者開始寫Netty源碼分析的時(shí)候,Netty 4.0還是處于Alpha階段,之后的API可能還會(huì)有改動(dòng),筆者將會(huì)及時(shí)更改。使用開源已經(jīng)有好幾年的時(shí)間了,一直沒有時(shí)間和精力來具體研究某個(gè)開源項(xiàng)目的具體實(shí)現(xiàn),這次是第一次寫開源項(xiàng)目的源碼分析,如果文中有錯(cuò)誤的地方,歡迎讀者可以留言指出。對(duì)于轉(zhuǎn)載的讀者,請(qǐng)注明文章的出處。
    希望和廣大的開發(fā)者/開源愛好者進(jìn)行交流,歡迎大家的留言和討論。

     



    -----------------------------------------------------
    Silence, the way to avoid many problems;
    Smile, the way to solve many problems;

    posted on 2012-11-26 10:57 Chan Chen 閱讀(2180) 評(píng)論(0)  編輯  收藏 所屬分類: Netty

    主站蜘蛛池模板: 亚洲精品国产综合久久一线| 亚洲色图在线播放| 精品免费tv久久久久久久| 亚洲最新中文字幕| 国产jizzjizz视频全部免费| a级毛片毛片免费观看永久| 亚洲成人黄色在线观看| 亚洲精品国产精品乱码不卞| 亚洲an天堂an在线观看| 国产亚洲精品免费| 国产精品区免费视频| 亚洲av无码一区二区三区在线播放| 亚洲狠狠婷婷综合久久久久| 毛片免费vip会员在线看| 中国一级毛片视频免费看| 久久精品乱子伦免费| 亚洲老熟女五十路老熟女bbw| 日本亚洲国产一区二区三区| 成人午夜大片免费7777| 亚在线观看免费视频入口| 色综合久久精品亚洲国产| 久久亚洲熟女cc98cm| 国产av无码专区亚洲国产精品| 57PAO成人国产永久免费视频| 中文字幕免费播放| 成人精品国产亚洲欧洲| 亚洲日韩中文字幕天堂不卡| 亚洲欧洲日产国码av系列天堂| 四虎影院免费视频| 国产高清免费视频| 免费观看男人吊女人视频| 免费看一级一级人妻片| 亚洲色丰满少妇高潮18p| 久久精品蜜芽亚洲国产AV| 亚洲熟妇无码乱子AV电影| 国产精品国产免费无码专区不卡 | 亚洲av午夜成人片精品电影| 久久国内免费视频| 最近免费中文字幕大全免费 | 亚洲AV无码码潮喷在线观看| 免费一级毛片在级播放|