Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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
Java 普通Spring批处理示例中非作业方法的Bean注释的用途_Java_Spring_Spring Boot_Spring Batch - Fatal编程技术网

Java 普通Spring批处理示例中非作业方法的Bean注释的用途

Java 普通Spring批处理示例中非作业方法的Bean注释的用途,java,spring,spring-boot,spring-batch,Java,Spring,Spring Boot,Spring Batch,我正在逐渐熟悉整个Spring stack 这里我指的是Spring.io上发布的一个简单的Spring批处理示例: 作业配置类BatchConfiguration中的每个方法都使用@Bean进行注释。除了job方法importUserJob之外,注释由创建作业的singleton类型Bean方法调用的singleton类型Bean助手方法是否有意义 在我看来,通过从除importUserJob之外的所有方法中删除@Bean注释,所有这些代码将仅在每个Spring实例中调用一次,并且仅从impo

我正在逐渐熟悉整个Spring stack

这里我指的是Spring.io上发布的一个简单的Spring批处理示例:

作业配置类
BatchConfiguration
中的每个方法都使用
@Bean
进行注释。除了job方法
importUserJob
之外,注释由创建作业的singleton类型Bean方法调用的singleton类型Bean助手方法是否有意义

在我看来,通过从除
importUserJob
之外的所有方法中删除
@Bean
注释,所有这些代码将仅在每个Spring实例中调用一次,并且仅从
importUserJob
方法中调用

所有Spring批处理示例都显示了非作业方法周围的
@Bean
注释,因此一定有什么东西让我无法理解

删节如下:

@配置
@启用批处理
公共类批处理配置{
@自动连线公共JobBuilderFactory JobBuilderFactory;
@自连线公共StepBuilderFactory StepBuilderFactory;
@自动连线公共数据源;
@豆子
公共FlatFileItemReader()。。。
@豆子
公共PersonItemProcessor处理器()。。。
@豆子
公共JdbcBatchItemWriter编写器()。。。
@豆子
公共作业导入器作业(作业完成通知侦听器侦听器){
返回jobBuilderFactory.get(“importUserJob”)
.incrementer(新的RunIdIncrementer())
.listener(侦听器)
.flow(步骤1())
(完)
.build();
}
@豆子
公共步骤step1()。。。
}

感谢您的阅读和帮助。

从技术上讲,对于您提到的那些函数,您可以不使用
@Bean
编写批处理,并且您的假设是正确的,因为这些Bean没有在其他地方使用。(我自己还没有试过,但我认为它会运行——如果SpringBatch不将它们用于其他东西的话)

@Bean
注释对象的生命周期由Spring处理,因此它可以正确地执行依赖项注入。通过这种方式,您可以将对象的构造与其用途(IoC)分开。特别是,当您使用自动连接时,依赖项注入变得更加容易

当然,您可以手动执行此操作,但这将需要大量样板代码,并且您需要发送已配置的对象。在您的示例中,为所有内容创建bean可能没有任何好处,但当批处理变得更大时,我相信您将错过Springs bean处理的灵活性。我个人编写了一批没有Springs依赖注入的其他框架。首先我有一个紧凑的模型,但随着事情的发展,我真的感到样板代码的痛苦,这影响了我代码的可读性

此外,Spring管理的bean还负责做其他事情,例如关闭资源

当然,依赖项注入只是一种工具,对于某些用例来说可能是一种过度使用。您可能对这些条款感兴趣:


    • 注释
      @Bean
      生成方法Bean创建方法,生成的对象将作为Bean在Spring
      ApplicationContext
      中注册

      因此,它将参与所述上下文的生命周期,并接收回调,如将调用的
      @PostConstruct
      带注释的方法或接口回调,如
      InitializingBean

      如果省略
      @Bean
      ,则不会发生这种情况。例如,这将导致未调用
      afterPropertiesSet
      方法,这将导致未完全初始化的bean


      因此,不要忽略
      @Bean
      ,因为
      @Bean
      相当于XML中的

      FlatFileItemReader::afterPropertiesSet
      只执行断言,因此删除
      @Bean
      只会导致未初始化的Bean。似乎对于所有返回Spring子类型的方法来说,
      @Bean
      更像是一种最佳实践。这个示例似乎模仿了这个XML片段
      不,这不仅仅是一个最佳实践,这些bean必须是Springbean。您不想冒着回调不被遵守的风险,其次,您还失去了执行后期绑定、属性解析等的能力。因此,这不仅仅是一种最佳实践。。。
      
      @Configuration
      @EnableBatchProcessing
      public class BatchConfiguration {
          @Autowired public JobBuilderFactory jobBuilderFactory;
          @Autowired public StepBuilderFactory stepBuilderFactory;
          @Autowired public DataSource dataSource;
      
          @Bean
          public FlatFileItemReader<Person> reader() ...
      
          @Bean
          public PersonItemProcessor processor() ...
      
          @Bean
          public JdbcBatchItemWriter<Person> writer() ...
      
          @Bean
          public Job importUserJob(JobCompletionNotificationListener listener) {
              return jobBuilderFactory.get("importUserJob")
                      .incrementer(new RunIdIncrementer())
                      .listener(listener)
                      .flow(step1())
                      .end()
                      .build();
          }
      
          @Bean
          public Step step1() ...
      }