基于注解配置的 Spring 使用 WebFlux

我有一个 Netty 的项目要增加一个 HTTP Server ,不能改成 Spring Boot ,但是本身使用 Spring 作依赖注入,然后就想着能不能直接使用 Netty 处理这些 Http 请求。。。在网上搜了半天,感觉往里面塞个 Servlet 不太好,于是还是回去用 Spring 的 WebFlux。虽然 WebFlux 一般都捆着 Spring Boot ,但是想着应该可以单独使用吧。。。于是就试了一下。。

一开始先找到这里 23.3.2 Manual Bootstrapping ,结果半天找不到 DispatcherHandler.toHttpHandler() 方法(懵)然后就想了些歪门邪道了(x

Maven 依赖


  5.0.4.RELEASE
  2.9.0



  com.fasterxml.jackson.core
  jackson-core
  ${jackson.version}



  com.fasterxml.jackson.core
  jackson-databind
  ${jackson.version}



  com.fasterxml.jackson.core
  jackson-annotations
  ${jackson.version}



  org.springframework
  spring-context
  ${spring.version}



  org.springframework
  spring-context-support
  ${spring.version}





  io.netty
  netty-all
  4.1.13.Final



  org.springframework
  spring-webflux
  ${spring.version}



  io.projectreactor.ipc
  reactor-netty
  0.7.5.RELEASE



  io.projectreactor
  reactor-core
  3.1.5.RELEASE

ApplicationConfigure.java 不需要写什么东西

@Configuration
@EnableWebFlux
@ComponentScan("com.example")
public class ApplicationConfigure {
  
}

ApiServer.java 是我项目里的 HTTP 服务器

@Component
public class ApiServer{

    private ApplicationContext applicationContext;
    private HttpServer httpServer;

    public ApiServer(ApplicationContext applicationContext){
        this.applicationContext = applicationContext;
        httpServer = HttpServer.create("0.0.0.0",8080);
    }

    // 可以丢到 Configuration 里面,这样就不需要像我这样注册钩子了
    @PostConstruct
    public void start(){
        httpServer.start(new ReactorHttpHandlerAdapter(
                WebHttpHandlerBuilder
                        .applicationContext(applicationContext)
                        .build()
        ));
    }

    // 习惯性写上去的没啥用。。。
    @PreDestroy
    public void stop(){
    }

}

随便写个 HelloController.java 。这里类注解要用 @RestController ,不然返回结果的时候会冒 viewResolver Not Found 之类的错误。

@RestController
public class HelloController {
    @GetMapping
    public String hello() {
        return "Hello world";
    }
}

启动用的 Main.java

public class Main {
    private final static Logger logger = LoggerFactory.getLogger(Loggers.APPLICATION);

    public static void main(String... args) {
        logger.debug("Loading application context...");

        AbstractApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
        // 生命周期钩子用的而已
        context.registerShutdownHook();

        logger.info("Application context loaded.");
    }
}

然后访问 http://localhost:8080 就出来一个 HelloWorld 囖~

关于视图或者其他的话还得去查一下 WebFlux 相关的内容。

你可能感兴趣的:(基于注解配置的 Spring 使用 WebFlux)