最小化SpringBoot 2中的方法注入参数

时间:2018-09-28 15:15:45

标签: spring spring-boot

我是Spring社区的新手,我对减少方法注入参数的数量有疑问。

示例

配置类

@Configuration
public class CustomConfig {

    @Bean
    public Step readStep() {
        return new MyObject();
    }

    @Bean
    public Step validateStep() {
        return new MyObject();
    }

    @Bean
    public Step writeStep() {
        return new MyObject();
    }

}

工作班

public class SomeJob {

    @Bean
    public Job someServiceMethod(@Qualifier("readStep" Step readStep, 
           @Qualifier("writeStep" Step writeStep,
           @Qualifier("validateStep" Step validateStep) {
              //Do something
    }
}

所以我想知道是否有一种方法可以将方法注入参数的数量减少到一个。例如,可能将CustomConfig.java作为参数而不是每个bean注入。

public class SomeJob {

    @Bean
    public Job someServiceMethod(CustomConfig config) {
        config.readStep//etc
        //Do something
    }
}

3 个答案:

答案 0 :(得分:1)

您可以使用已注入的所有必需bean创建@component。 将其命名为MyCustomJobCommonCOnfig,并将其用作一个方法参数。

答案 1 :(得分:1)

仅提供Grigoriev Nick答案的代码示例。

@Configuration
public class CustomConfig {

    //Create a component injecting required beans into it. 
    @Getter
    @Component
    @RequiredArgsConstructor
    public class JobConfig {
        private final Step readStep;
        private final Step validateStep;
        private final Step writeStep;
    }

    @Bean
    public Step readStep() {
        return new MyObject();
    }

    @Bean
    public Step validateStep() {
        return new MyObject();
    }

    @Bean
    public Step writeStep() {
        return new MyObject();
    }

}

public class SomeJob {

    //Inject comonent into method. 
    @Bean
    public Job someServiceMethod(JobConfig config) {
          Step read = config.getReadStep(),
               validate = config.getValidateStep(),
               write = config.getWriteStep();

    }
}

答案 2 :(得分:0)

您可以使用AnnotationConfigApplicationContext

CustomConfig中的每个bean添加一个名称:

@Bean(name="readStep")
    public Step readStep() {
        return new MyObject();
    }

然后只需实例化一个AnnotationConfigApplicationContext并使用register方法(它接受一个bean配置类),然后使用getBean方法来获取单个bean。

public class SomeJob {

  @Bean
  public Job someServiceMethod() {
  AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();

  applicaionContext.register(CustomConfig.class);
  applicationContext.refresh();

  Step readStep = (Step) applicationContext.getBean("readStep");

  }
}