在SpringBoot中啟動Netty
方式1
-
設置一個ApplicationListener
@Component public class NettyBooter implements ApplicationListener<ContextRefreshedEvent>{ @Override public void onApplicationEvent(ContextRefreshedEvent event) { if(event.getApplicationContext().getParent()==null) { try { NettyServer.getInstance().start(); } catch (Exception e) { e.printStackTrace(); } } } }
-
NettyServer
@Component public class NettyServer { private static class SingletonNettyServer{ static final NettyServer instance = new NettyServer(); } private EventLoopGroup mainGroup; private EventLoopGroup subGroup; private ServerBootstrap serverBootstrap; private ChannelFuture future; public static NettyServer getInstance() { return SingletonNettyServer.instance; } public NettyServer(){ mainGroup = new NioEventLoopGroup(); subGroup = new NioEventLoopGroup(); serverBootstrap = new ServerBootstrap(); serverBootstrap.group(mainGroup, subGroup) .channel(NioServerSocketChannel.class) .childHandler(new NettyServerInitializer()); } public void start(){ this.future = serverBootstrap.bind(9999); System.err.println("netty 服務啟動成功"); } }
方式2
使用注解@PostConstruct啟動
@Component大家都能熟悉了,就是把普通pojo實例化到spring容器中,相當於配置文件中的
。泛指各種組件,比如類不屬於@Controller或者@Service等時,就可以用該注解標注; @PostConstruct這個注解是我第一次接觸,在方法上加該注解會在項目啟動的時候執行該方法,即spring容器初始化的時候執行,它與構造函數及@Autowired的執行順序為:構造函數 >> @Autowired >> @PostConstruct,由此看來當我們想在生成對象時完成某些初始化操作,而偏偏這些初始化操作又依賴於注入的bean,那么就無法在構造函數中實現,為此可以使用@PostConstruct注解一個init方法來完成初始化,該方法會在bean注入完成后被自動調用。
@Component
public class NettyServer {
private EventLoopGroup mainGroup;
private EventLoopGroup subGroup;
private ServerBootstrap serverBootstrap;
private ChannelFuture future;
public NettyServer(){
mainGroup = new NioEventLoopGroup();
subGroup = new NioEventLoopGroup();
serverBootstrap = new ServerBootstrap();
serverBootstrap.group(mainGroup, subGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new NettyServerInitializer());
}
@PostConstruct
public void start(){
this.future = serverBootstrap.bind(9999);
System.err.println("netty 服務啟動成功");
}
}