吃透Netty源码系列二之ServerBootstrap

深入剖析Netty框架的ServerBootstrap启动器,详细解读NioServerSocketChannel创建与初始化过程,探讨反射通道工厂与ChannelHandlerContext的实现机制。

启动器ServerBootstrap

继续上次的例子,上次已经创建了bossGroupworkerGroup,接下去就是创建启动器了。我们先看看这个结构图:
在这里插入图片描述
可以看到他的父类其实和他基本平分一般属性的设置。其实构造方法没做什么,只是初始化了一些属性和选项的集合和ServerBootstrapConfig实例。
然后设置两个group就把上图的两个Group设置了一下:

 bootstrap.group(bossGroup, workerGroup)

这个channel(NioServerSocketChannel.class)就有讲究了,一看传的是个Class对象,应该能想到要反射了。看源码:

    public B channel(Class<? extends C> channelClass) {
   
   
        return channelFactory(new ReflectiveChannelFactory<C>(
                ObjectUtil.checkNotNull(channelClass, "channelClass")
        ));
    }

有创建反射通道工厂new ReflectiveChannelFactory,就是通过反射获得无参构造函数this.constructor,当调用newChannel()的时候就可以创建对象了,看下ReflectiveChannelFactory这个类:

public class ReflectiveChannelFactory<T extends Channel> implements ChannelFactory<T> {
   
   
//取得构造函数后面直接创建实例
    private final Constructor<? extends T> constructor;

    public ReflectiveChannelFactory(Class<? extends T> clazz) {
   
   
        ObjectUtil.checkNotNull(clazz, "clazz");
        try {
   
   
            this.constructor = clazz.getConstructor();//无参构造函数
        } catch (NoSuchMethodException e) {
   
   
            throw new IllegalArgumentException("Class " + StringUtil.simpleClassName(clazz) +
                    " does not have a public non-arg constructor", e);
        }
    }

    @Override
    public T newChannel() {
   
   
        try {
   
   
            return constructor.newInstance();
        } catch (Throwable t) {
   
   
            throw new ChannelException("Unable to create Channel from class " + constructor.getDeclaringClass(), t);
        }
    }

    @Override
    public String toString() {
   
   
        return StringUtil.simpleClassName(ReflectiveChannelFactory.class) +
                '(' + StringUtil.simpleClassName(constructor.getDeclaringClass()) + ".class)";
    }
}

一目了然了,继续channelFactory方法,就是设置通道工厂,返回自身,继续链式调用:

    public B channelFactory(io.netty.channel.ChannelFactory<? extends C> channelFactory) {
   
   
        return channelFactory((ChannelFactory<C>) channelFactory);
    }
     public B channelFactory(ChannelFactory<? extends C> channelFactory) {
   
   
        ObjectUtil.checkNotNull(channelFactory, "channelFactory");
        if (this.channelFactory != null) {
   
   
            throw new IllegalStateException("channelFactory set already");
        }

        this.channelFactory = channelFactory;
        return self();
    }

然后我们继续childHandler(ChannelHandler childHandler) ,其实也就设置childHandler ,这个时候设置的其实就是通道的初始化ChannelInitializer

    public ServerBootstrap childHandler(ChannelHandler childHandler
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值