spring-batch 示例:为什么直接调用构造方法?

问题描述 投票:0回答:1

我正在查看 spring-batch 的示例,我惊讶地发现 bean 构造函数方法被直接调用,而不是通过 bean 引用。我想知道这是否是一个错误。

https://github.com/TechPrimers/spring-batch-example-1/blob/master/src/main/java/com/techprimers/springbatchexample1/config/SpringBatchConfig.java

...
@Configuration
@EnableBatchProcessing
public class SpringBatchConfig {

    ...

    @Bean
    public FlatFileItemReader<User> itemReader() {

        FlatFileItemReader<User> flatFileItemReader = new FlatFileItemReader<>();
        ...
        flatFileItemReader.setLineMapper(lineMapper());
        return flatFileItemReader;
    }

    @Bean
    public LineMapper<User> lineMapper() {
      ...
    }

bean 构造函数方法

lineMapper()
被注释为
@Bean
,bean 构造函数方法
itemReader()
不会在其构造函数中注入 bean,而是直接调用
lineMethod()

我本来期望

itemReader()
的定义:

@Bean
public FlatFileItemReader<User> itemReader(LineMapper<User> lineMapper) {

    FlatFileItemReader<User> flatFileItemReader = new FlatFileItemReader<>();
    ...
    flatFileItemReader.setLineMapper(lineMapper);
    return flatFileItemReader;
}

这不是当前 spring-batch 样本中的错误吗?或者我错过了什么?也许

@Configuration
做了一些神奇的事情,将对构造函数的直接调用转换为带有代理的 bean?也许
lineMapper()
根本不需要是豆子?

感谢您的任何见解。

spring spring-batch
1个回答
0
投票

您提到的两种方式都会有相同的效果,将

LineMapper
bean 注入
FlatFileItemReader
@bean
方法来创建它。

SpringBatchConfig
中使用的功能称为注入bean间依赖关系,它允许通过直接方法调用将bean注入到
@Bean
方法中。你的猜测是正确的,如果你有兴趣知道它在代码级别是如何工作的,它的工作原理是
@Bean
方法由
ConfigurationClassEnhancer.BeanMethodInterceptor
代理。

请注意,仅当您使用 full bean 模式(即,您在用

@Bean
注释的对象中定义
@Configuration
方法)且
proxyBeanMethods
@Configuration
为 true(默认值)时,此功能才会启用。 ).

否则,以下情况将导致调用

lineMapper()
只是创建一个新的单独实例,但不能从 spring 上下文访问
LineMapper
实例:

@Compenent
public class SpringBatchConfig {


    @Bean
    public FlatFileItemReader<User> itemReader() {
        FlatFileItemReader<User> flatFileItemReader = new FlatFileItemReader<>();
        ...
        flatFileItemReader.setLineMapper(lineMapper());
        return flatFileItemReader;
    }

    @Bean
    public LineMapper<User> lineMapper() {
      ...
    }

您正在使用完整 bean 模式

proxyBeanMethods=false
:

@Configuration(proxyBeanMethods = false)
public class SpringBatchConfig {


    @Bean
    public FlatFileItemReader<User> itemReader() {
        FlatFileItemReader<User> flatFileItemReader = new FlatFileItemReader<>();
        ...
        flatFileItemReader.setLineMapper(lineMapper());
        return flatFileItemReader;
    }

    @Bean
    public LineMapper<User> lineMapper() {
      ...
    }
© www.soinside.com 2019 - 2024. All rights reserved.