本手册仍在编写中,目前尚未完善。
如果您想帮助改进它,我们希望您能这样做,请查看 README

19 Spring Boot

ratpack-spring-boot 扩展提供了与 Spring Boot 的集成。该库有两个主要功能:一个允许从 Spring ApplicationContext 创建 Ratpack 服务器注册表,另一个允许将 Ratpack 本身嵌入 Spring Boot 应用程序(使 ApplicationContext 自动成为服务器注册表的一部分)。

1.19 Spring 便利类

在普通 Ratpack 应用程序中,您可以使用 Spring 便利类轻松创建注册表。这可以作为 Guice 依赖注入的替代或补充,因为它或多或少以相同的方式工作,并且 Ratpack 允许将注册表方便地链接在一起。

以下是一个使用此 API 来配置应用程序的主类示例。

package my.app;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ratpack.core.server.RatpackServer;

import static ratpack.spring.Spring.spring;

public class Main {
  public static void main(String... args) throws Exception {
    RatpackServer.start(server -> server
      .registry(spring(MyConfiguration.class))
      .handlers(chain -> chain
        .get(ctx -> ctx
          .render("Hello " + ctx.get(Service.class).message()))
        .get(":message", ctx -> ctx
          .render("Hello " + ctx.getPathTokens().get("message") + "!")
        )
      )
    );
  }
}

@Configuration
class MyConfiguration {
  @Bean
  public Service service() {
    return () -> "World!";
  }
}

interface Service {
  String message();
}

Spring.spring() 方法创建一个 ApplicationContext 并将其适配到 Ratpack Registry 接口。

注意:Spring ListableBeanFactory API 目前不支持查找带有参数化类型的 bean。因此,由于此限制,适配后的 Registry 实例不支持此操作。有一个 功能请求 将泛型功能添加到 Spring ListableBeanFactory API。

2.19 在 Spring Boot 应用程序中嵌入 Ratpack

作为在 Ratpack 应用程序中嵌入 Spring(作为 Registry)的替代方法,您可以执行相反的操作:将 Ratpack 作为服务器嵌入 Spring Boot,为 Spring Boot 支持的 Servlet 容器提供了一个不错的替代方法。该功能集的核心是一个注释 @EnableRatpack,您可以将其添加到 Spring 配置类中以启动 Ratpack。然后,您可以将处理程序声明为 @Beans 类型 Action<Chain>,例如

package my.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import ratpack.func.Action;
import ratpack.core.handling.Chain;
import ratpack.spring.config.EnableRatpack;

@SpringBootApplication
@EnableRatpack
public class Main {

  @Bean
  public Action<Chain> home() {
    return chain -> chain
      .get(ctx -> ctx
        .render("Hello " + service().message())
      );
  }

  @Bean
  public Service service() {
    return () -> "World!";
  }

  public static void main(String... args) throws Exception {
    SpringApplication.run(Main.class, args);
  }

}

interface Service {
  String message();
}

提示:Ratpack 将为类路径下“/public”或“/static”中的静态内容自动注册处理程序(就像常规的 Spring Boot 应用程序一样)。

1.2.19 重复使用现有的 Guice 模块

如果 Ratpack 嵌入到 Spring 应用程序中,重复使用现有的 Guice 模块可能会有所帮助,例如用于模板渲染。为此,只需包含一个类型为 Module@Bean。例如,使用 Thymeleaf 支持的 ThymeleafModule

package my.app;

import java.util.Collections;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import ratpack.func.Action;
import ratpack.core.handling.Chain;
import ratpack.thymeleaf.ThymeleafModule;
import ratpack.spring.config.EnableRatpack;

import static ratpack.thymeleaf3.Template.thymeleafTemplate;

@SpringBootApplication
@EnableRatpack
public class Main {

  @Bean
  public Action<Chain> home(Service service) {
    return chain -> chain.get(ctx -> ctx
      .render(thymeleafTemplate("myTemplate", 
        m -> m.put("key", "Hello " + service.message())))
    );
  }

  @Bean
  public ThymeleafModule thymeleafModule() {
    return new ThymeleafModule();
  }

  @Bean
  public Service service() {
    return () -> "World!";
  }

  public static void main(String... args) throws Exception {
    SpringApplication.run(Main.class, args);
  }

}