Java 如何使用函数式Bean注册配置应用程序上下文

Java 如何使用函数式Bean注册配置应用程序上下文,java,spring-boot,Java,Spring Boot,我正试图将我的SpringBoot应用程序重新转换为FunctionalBean注册表单,以加快应用程序的启动速度,正如Spring云函数的Spring文档中所提到的那样。以下是文档中引用的代码: @SpringBootConfiguration public class DemoApplication implements ApplicationContextInitializer<GenericApplicationContext> { public static void

我正试图将我的SpringBoot应用程序重新转换为FunctionalBean注册表单,以加快应用程序的启动速度,正如Spring云函数的Spring文档中所提到的那样。以下是文档中引用的代码:

@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)));
  }

}
@SpringBootConfiguration
公共类DemoApplication实现ApplicationContextInitializer{
公共静态void main(字符串[]args){
FunctionalSpringApplication.run(DemoApplication.class,args);
}
公共函数大写(){
返回值->value.toUpperCase();
}
@凌驾
公共void初始化(GenericaApplicationContext上下文){
registerBean(“demo”,FunctionRegistration.class,
()->新函数注册(大写())
.type(FunctionType.from(String.class).to(String.class));
}
}
下面是我试图遵循上述示例的代码。主要区别在于我的函数是一个单独的类,它实现了Java8函数接口

import com.example.functions.RockPaperScissors;
import com.example.model.Game;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.cloud.function.context.FunctionRegistration;
import org.springframework.cloud.function.context.FunctionType;
import org.springframework.cloud.function.context.FunctionalSpringApplication;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.support.GenericApplicationContext;

@Slf4j
@ComponentScan
@SpringBootConfiguration
public class Application implements ApplicationContextInitializer<GenericApplicationContext> {

  private RockPaperScissors rockPaperScissors;

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

  @Override
  public void initialize(GenericApplicationContext applicationContext) {
    applicationContext.registerBean(
        "rpsFunction",
        FunctionRegistration.class,
        () ->
            new FunctionRegistration<>(this.rockPaperScissors)
                .type(FunctionType.from(Game.class).to(String.class)));
  }

  @Autowired
  public void setRpsFunction(RockPaperScissors rockPaperScissors) {
    this.rockPaperScissors = rockPaperScissors;
  }
}

import com.example.functions.rock剪纸机;
导入com.example.model.Game;
导入lombok.extern.slf4j.slf4j;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.boot.SpringBootConfiguration;
导入org.springframework.cloud.function.context.FunctionRegistration;
导入org.springframework.cloud.function.context.FunctionType;
导入org.springframework.cloud.function.context.FunctionalSpringApplication;
导入org.springframework.context.ApplicationContextInitializer;
导入org.springframework.context.annotation.ComponentScan;
导入org.springframework.context.support.GenericaApplicationContext;
@Slf4j
@组件扫描
@SpringBoot配置
公共类应用程序实现ApplicationContextInitializer{
私人石头剪刀;
公共静态void main(字符串[]args){
FunctionalSpringApplication.run(Application.class,args);
}
@凌驾
公共void初始化(GenericaApplicationContext应用上下文){
applicationContext.registerBean(
“rpsFunction”,
FunctionRegistration.class,
() ->
新功能注册(此为RockPaperScissor)
.type(FunctionType.from(Game.class).to(String.class));
}
@自动连线
公共无效设置功能(RockPaperScissor RockPaperScissors){
this.rockPaperScissors=rockPaperScissors;
}
}
我遇到的问题是java.lang.IllegalArgumentException:“target”不能为null。我知道这是因为找不到应用程序上下文,但不确定为什么
FunctionalSpringApplication.run(DemoApplication.class,args)没有创建该上下文