Aware 注入
介绍
框架目前还没有 DI 特性 ,因此无法实现将一些对象注入到其他对象属性中,但框架提供了 Aware 的方式来支持类似的功能。
在我们扩展一些自定义 NettyHandler 或心跳与用户钩子接口时,可以通过 Aware 特性来获取
- UserSessions,连接中所有玩家的管理对象。
- BrokerClient,与 Broker(游戏网关)通信的对象。
Aware 系列接口
接口名 | 描述 |
---|---|
UserSessionsAware | 框架会调用此方法,将 UserSessions 对象传入 |
ExternalCoreSettingAware | 框架会调用此方法,将 ExternalCoreSetting 对象传入 |
BrokerClientAware | 框架会调用此方法,将 BrokerClient 对象传入 BrokerClient 是与 Broker(游戏网关)通信的对象 |
如何使用
在钩子接口中使用
public class DemoUserHook implements UserHook, UserSessionsAware, BrokerClientAware {
BrokerClient brokerClient;
UserSessions<?, ?> userSessions;
...
@Override
public void setUserSessions(UserSessions<?, ?> userSessions) {
this.userSessions = userSessions;
}
@Override
public void setBrokerClient(BrokerClient brokerClient) {
this.brokerClient = brokerClient;
}
}
在 NettyHandler 中使用
自定义 NettyHandler
我们自定义 YourNettyHandler 类,并实现 UserSessionsAware 接口。
@ChannelHandler.Sharable
public final class YourNettyHandler extends ChannelInboundHandlerAdapter
implements UserSessionsAware {
SocketUserSessions userSessions;
...
@Override
public void setUserSessions(UserSessions<?, ?> userSessions) {
this.userSessions = (SocketUserSessions) userSessions;
}
}
我们将 YourNettyHandler 添加到游戏对外服。
public class Example {
ExternalServer createExternalServer() {
...
DefaultExternalServerBuilder builder = ...
DefaultExternalCoreSetting setting = builder.setting();
setting.setMicroBootstrapFlow(new WebsocketMicroBootstrapFlow() {
@Override
public void pipelineCustom(PipelineContext context) {
super.pipelineCustom(context);
context.addLast("YourNettyHandler", new YourNettyHandler());
}
});
return builder.build();
}
}
warning
一定要使用 context.addLast
来添加 NettyHandler,否则 Aware 无法注入。
更多示例
请参考内置与可选的 Handler 的实现类源码。