吃透Netty源码系列二之ServerBootstrap
启动器ServerBootstrap
继续上次的例子,上次已经创建了bossGroup和workerGroup,接下去就是创建启动器了。我们先看看这个结构图:

可以看到他的父类其实和他基本平分一般属性的设置。其实构造方法没做什么,只是初始化了一些属性和选项的集合和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

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

被折叠的 条评论
为什么被折叠?



