Aware
介绍
框架目前还没有 DI 特性 ,因此无法实现将一些对象注入到其他对象属性中,但框架提供了 Aware 的方式来支持类似的功能。
ExternalSettingAware
在我们扩展一些自定义 NettyHandler 或心跳与用户钩子接口时,可以通过 Aware 特性来获取
- UserSessions,连接中所有玩家的管理对象。
- Server 对外服信息。
- ConvenientCommunication 便捷通信对象。
public interface ExternalSettingAware {
void setExternalSetting(ExternalSetting setting);
}
实现 ExternalSettingAware 接口后,框架会自动调用 setExternalSetting 方法。
如何使用
- code 7: 获取 UserSessions
- code 8: 获取 ConvenientCommunication
public final class MyUserHook implements UserHook,
ExternalSettingAware
{
UserSessions<?, ?> userSessions;
ConvenientCommunication convenientCommunication;
@Override
public void setExternalSetting(ExternalSetting setting) {
this.userSessions = setting.userSessions();
this.convenientCommunication = setting.convenientCommunication();
}
...
}
自定义 NettyHandler
@ChannelHandler.Sharable
public final class YourNettyHandler extends ChannelInboundHandlerAdapter
implements ExternalSettingAware
{
SocketUserSessions userSessions;
...
@Override
public void setExternalSetting(ExternalSetting setting) {
this.userSessions = setting.userSessions();
this.convenientCommunication = setting.convenientCommunication();
}
}
我们将 YourNettyHandler 添加到对外服。
private static ExternalServer ofExternalServer() {
var externalServerBuilder = MyExternalServer.builder(ExternalGlobalConfig.externalPort, ExternalJoinEnum.WEBSOCKET);
externalServerBuilder.setMicroBootstrapFlow(new WebSocketMicroBootstrapFlow(){
@Override
public void pipelineCustom(PipelineContext context) {
super.pipelineCustom(context);
context.addLast("YourNettyHandler", new YourNettyHandler());
}
});
return externalServerBuilder.build();
}
注意
一定要使用 context.addLast 来添加 NettyHandler,否则 Aware 无法注入。
更多示例
请参考内置与可选的 Handler 的实现类源码。