SpringCloud 將功能與傳統(tǒng)的Bean定義進(jìn)行比較

2024-01-06 11:16 更新

這是一種普通的Spring Cloud函數(shù)應(yīng)用程序,具有相似的@Configuration@Bean聲明樣式:

@SpringBootApplication
public class DemoApplication {

  @Bean
  public Function<String, String> uppercase() {
    return value -> value.toUpperCase();
  }

  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }

}

您可以在無(wú)服務(wù)器平臺(tái)(如AWS Lambda或Azure Functions)中運(yùn)行以上命令,也可以僅在類路徑中包含spring-cloud-function-starter-web,即可在其自己的HTTP服務(wù)器中運(yùn)行上述命令。運(yùn)行main方法將公開(kāi)一個(gè)端點(diǎn),您可以使用該端點(diǎn)ping uppercase函數(shù):

$ curl localhost:8080 -d foo
FOO

spring-cloud-function-starter-web中的web適配器使用Spring MVC,因此您需要一個(gè)Servlet容器。您也可以在默認(rèn)服務(wù)器為netty的地方使用Webflux(即使您仍然愿意使用Servlet容器),也可以使用spring-cloud-starter-function-webflux依賴項(xiàng)。 功能相同,并且兩者都可以使用用戶應(yīng)用程序代碼。

現(xiàn)在,對(duì)于功能beans:用戶應(yīng)用程序代碼可以重鑄為“功能”形式,如下所示:

@SpringBootConfiguration
public class DemoApplication implements ApplicationContextInitializer<GenericApplicationContext> {

  public static void main(String[] args) {
    FunctionalSpringApplication.run(DemoApplication.class, args);
  }

  public Function<String, String> uppercase() {
    return value -> value.toUpperCase();
  }

  @Override
  public void initialize(GenericApplicationContext context) {
    context.registerBean("demo", FunctionRegistration.class,
        () -> new FunctionRegistration<>(uppercase())
            .type(FunctionType.from(String.class).to(String.class)));
  }

}

主要區(qū)別在于:

  • 主要類是ApplicationContextInitializer。
  • @Bean方法已轉(zhuǎn)換為對(duì)context.registerBean()的調(diào)用
  • @SpringBootApplication已替換為@SpringBootConfiguration,以表示我們未啟用Spring引導(dǎo)自動(dòng)配置,但仍將該類標(biāo)記為“入口點(diǎn)”。
  • Spring Boot中的SpringApplication已被Spring Cloud函數(shù)中的FunctionalSpringApplication取代(它是一個(gè)子類)。

您在Spring Cloud Function應(yīng)用程序中注冊(cè)的業(yè)務(wù)邏輯beans的類型為FunctionRegistration。這是一個(gè)包裝,其中包含函數(shù)以及有關(guān)輸入和輸出類型的信息。在本應(yīng)用程序的@Bean形式中,信息可以反射性地導(dǎo)出,但是在功能性bean注冊(cè)中,除非我們使用FunctionRegistration,否則其中的一些信息會(huì)丟失。

使用ApplicationContextInitializerFunctionRegistration的替代方法是使應(yīng)用程序本身實(shí)現(xiàn)Function(或ConsumerSupplier)。 示例(與上述等效):

@SpringBootConfiguration
public class DemoApplication implements Function<String, String> {

  public static void main(String[] args) {
    FunctionalSpringApplication.run(DemoApplication.class, args);
  }

  @Override
  public String uppercase(String value) {
    return value.toUpperCase();
  }

}

如果您添加類型為Function的獨(dú)立類,并使用run()方法的另一種形式向SpringApplication注冊(cè),它也將起作用。最主要的是,泛型類型信息可在運(yùn)行時(shí)通過(guò)類聲明獲得。

如果您添加spring-cloud-starter-function-webflux,則該應(yīng)用程序?qū)⒃谄渥约旱腍TTP服務(wù)器上運(yùn)行(由于尚未實(shí)現(xiàn)嵌入式Servlet容器的功能形式,因此它目前無(wú)法與MVC啟動(dòng)器一起使用)。該應(yīng)用程序還可以在AWS Lambda或Azure Functions中正常運(yùn)行,并且啟動(dòng)時(shí)間的改善是巨大的。

“精簡(jiǎn)型” web服務(wù)器對(duì)Function簽名的范圍有一些限制-特別是它(目前)還不支持Message輸入和輸出,但是POJO和任何類型的Publisher應(yīng)該沒(méi)事。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)