Springboot中啟動netty的兩種方式


在SpringBoot中啟動Netty

方式1

  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();
    			}
    		}
    	}
    }
    
  2. 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 服務啟動成功");
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM