我正在查看 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()
根本不需要是豆子?
感谢您的任何见解。
您提到的两种方式都会有相同的效果,将
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() {
...
}