1. ServerBootstrap的使用:
通过链式的方式逐个调用group
、channel
、handler
、childHandler
方法,本质上是对需要的变量进行赋值。
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new MyServerInitializer());
ServerBootStrap
继承了抽象类AbstractBootstrap
,作用是启动ServerChannel
。一些重要的变量定义位于父类AbstractBootStrap
中,而另一些位于子类ServerBootStrap
中,下面会提到。
2. group方法
public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) {
super.group(parentGroup);
if (childGroup == null) {
throw new NullPointerException("childGroup");
}
if (this.childGroup != null) {
throw new IllegalStateException("childGroup set already");
}
this.childGroup = childGroup;
return this;
}
- 第1行将参数 parentGroup 也就是
bossGroup
对象传入父类的group方法。 - 倒数第2行将 childGroup 也就是
workerGroup
赋值给当前类的成员变量childGroup
。 - 父类
AbstractBootStrap
的group方法如下:可以看到是将bossGroup
对象赋值给父类的成员变量group
。
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 self();
}
@SuppressWarnings("unchecked")
private B self() {
return (B) this;
}
-
self()
方法将AbstractBootStrap
类型强制转换为ServerBootStrap
类型。
2. channel方法
channel
方法位于父类中,本质是new
一个ReflectiveChannelFactory
,并赋值给父类的成员变量channelFactory
。 在需要的时候,使用持有的channelFactory
变量来创建channel
。
public B channel(Class<? extends C> channelClass) {
if (channelClass == null) {
throw new NullPointerException("channelClass");
}
return channelFactory(new ReflectiveChannelFactory<C>(channelClass));
}
public B channelFactory(ChannelFactory<? extends C> channelFactory) {
if (channelFactory == null) {
throw new NullPointerException("channelFactory");
}
if (this.channelFactory != null) {
throw new IllegalStateException("channelFactory set already");
}
this.channelFactory = channelFactory;
return self();
}
ReflectiveChannelFactory
实现了ChannelFactory
接口,它的newChannel
方法调用传入的Class对象的构造函数创建实例:
public class ReflectiveChannelFactory<T extends Channel> implements ChannelFactory<T> {
private final Class<? extends T> clazz;
public ReflectiveChannelFactory(Class<? extends T> clazz) {
if (clazz == null) {
throw new NullPointerException("clazz");
}
this.clazz = clazz;
}
@Override
public T newChannel() {
try {
return clazz.getConstructor().newInstance();
} catch (Throwable t) {
throw new ChannelException("Unable to create Channel from class " + clazz, t);
}
}
}
3. childHandler方法
该方法比较简单,逻辑依然和上面的方法类似,对变量childHandler
进行赋值:
public ServerBootstrap childHandler(ChannelHandler childHandler) {
if (childHandler == null) {
throw new NullPointerException("childHandler");
}
this.childHandler = childHandler;
return this;
}
4. 以上方法小结
group
, channel
, childHandler
方法对变量group
, childGroup
, channelFactory
, childHandler
变量进行了赋值。