Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SpringBoot 2中最小化方法注入参数_Spring_Spring Boot - Fatal编程技术网

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

在SpringBoot 2中最小化方法注入参数,spring,spring-boot,Spring,Spring Boot,我是Spring社区的新手,我对减少方法注入参数的数量有疑问 范例 配置类 @Configuration public class CustomConfig { @Bean public Step readStep() { return new MyObject(); } @Bean public Step validateStep() { return new MyObject(); } @Bean

我是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
    }
}
职业类别

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

您可以使用
注释ConfigApplicationContext

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");

  }
}

您可以使用
注释ConfigApplicationContext

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");

  }
}

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

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

仅为Grigoriev Nick answer提供一个代码示例

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

    }
}

仅提供Grigoriev Nick answer的代码示例

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

    }
}


从我对Spring的观点来看,我们可以用一个责任将项目分成几个小部分,但您正在尝试做一些事情。奇怪,你为什么要这么做?@Alexey Usharovsk我正在使用spring批处理,我有很多作业,其中一个配置类在作业之间有一些共享bean。当我创建我的作业bean时,我需要将这些共享bean放到我的作业配置中。实际共享的bean是Step的。我的问题已经澄清了一点。从我对Spring的观点来看,我们可以将项目拆分为一个负责的小bean,但您正在尝试做一些事情。奇怪,你为什么要这么做?@Alexey Usharovsk我正在使用spring批处理,我有很多作业,其中一个配置类在作业之间有一些共享bean。当我创建我的作业bean时,我需要将这些共享bean放到我的作业配置中。实际共享的bean是Step的。我的问题稍微澄清了一点。这似乎接近我想要的,您能提供一个示例代码来演示这个选项吗?我会继续使用配置注释中的CustomConfig,并使用组件注释创建一个额外的类MyCustomjob,然后将所有必需的bean注入到组件中吗?或者,这可以在配置类中使用组件注释而不是配置注释来完成吗?我的意思是,您可以只创建一个bean/coComponent,并在其中注入您想要的所有bean。您可以在单独的文件中创建一个单独的类,或者在同一文件中创建另一个带有子类的方法注释bean。没关系,只要你觉得方便就做吧。我总是忘记春天的豆子概念。谢谢。这似乎接近我想要的,你能提供一些示例代码来演示这个选项吗?我会继续使用配置注释使用我的CustomConfig,并使用组件注释创建一个额外的类MyCustomjob,然后将我所需的所有bean注入组件吗?或者,这可以在配置类中使用组件注释而不是配置注释来完成吗?我的意思是,您可以只创建一个bean/coComponent,并在其中注入您想要的所有bean。您可以在单独的文件中创建一个单独的类,或者在同一文件中创建另一个带有子类的方法注释bean。没关系,只要你觉得方便就做吧。我总是忘记春天的豆子概念。谢谢。这看起来比我已经在做的更复杂。Grigoriev Nick似乎认为我可以使用@Component并注入该组件,因此我希望看到一个关于如何做到这一点的小示例,但可能要简单得多。我只是想对您作为答案添加的代码发表评论,我在这里发表了评论,因为我还不能对其他答案发表评论。您正在将bean实例化为对象,而不是spring bean,因此在注入JobConfig之前,您需要为JobConfig中的每个对象使用@Autowired,还需要为这些bean创建一个单独的类(而不是内部类),就像Grigoriev Nick提到的那样。如果我没有弄错的话,RequiredArgsConstructor正在为我自动处理Autowired。我知道lombok正在使用构造函数注入。代码似乎在测试中正常工作,没有任何问题。如果没有autowire,这还能用吗?我明白了。我不知道RequiredArgsConstructor,它处理构造函数连接。是的,我喜欢它清理代码的方式。除了删除内部类之外,您还有其他建议吗?这似乎比我正在做的更复杂。Grigoriev Nick似乎认为我可以使用@Component并注入该组件,因此我希望看到一个关于如何做到这一点的小示例,但可能要简单得多。我只是想对您作为答案添加的代码发表评论,我在这里发表了评论,因为我还不能对其他答案发表评论。您正在将bean实例化为对象,而不是spring bean,因此在注入JobConfig之前,您需要为JobConfig中的每个对象使用@Autowired,还需要为这些bean创建一个单独的类(而不是内部类),就像Grigoriev Nick提到的那样。如果我没有弄错的话,RequiredArgsConstructor正在为我自动处理Autowired。我知道lombok正在使用构造函数注入。代码似乎在测试中正常工作,没有任何问题。如果没有autowire,这还能用吗?我明白了。我一点也不知道