我正在查看 spring-batch 的示例,我很惊讶地看到直接调用 bean 构造函数方法,而不是通过 bean 引用。我想知道这是否是一个错误。
...
@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()
根本不需要成为 Bean?
感谢您的任何见解。
您提到的两种方式都会有相同的效果,将 bean 注入到的方法
LineMapper
中。FlatFileItemReader
@bean
对于这种
SpringBatchConfig
情况,它使用注入 bean 间依赖项功能,该功能允许通过直接方法调用将 bean 注入到@Bean
方法中。你的猜测是正确的,它是有效的,因为如果你有兴趣知道它在代码级别是如何工作的,那么该@Bean
方法是由 代理的。ConfigurationClassEnhancer.BeanMethodInterceptor
请注意,仅当您使用完整 bean 模式(即 Then
@Bean
方法在类内部定义@Configuration
)和@Configuration
'sproxyBeanMethods=true
(默认值)时,此功能才会启用。否则,以下任何一种情况都会导致调用
lineMapper()
只是创建一个新实例,但不能LineMapper
从 spring 上下文访问该实例:proxyBeanMethods=false
: