我现在正处于一个我似乎无法解决的问题的真正痛苦之中。我希望这里有人能提供一些指导。它围绕stepscope、bean自动连接和bean创建展开。
配置一(自动连线步骤范围bean):
配置.java
(为了简单起见,我减少了配置类。)
@Configuration
@EnableBatchProcessing
public class Config {
@Bean
@StepScope
public StepScopeBeanOne stepScopeBeanOne() {
return new StepScopeBeanOne();
}
@Bean
@StepScope
public StepScopeBeanTwo stepScopeBeanTwo () {
return new StepScopeBeanTwo();
}
@Bean
@StepScope
public Processor processor() {
return new Processor();
}
}
处理器.java
public class Processor implements ItemProcessor<Incoming, Outgoing> {
//The two injected step scope beans...
@Autowired
private StepScopeBeanOne stepScopeBeanOne;
@Autowired
private StepScopeBeanTwo stepScopeBeanTwo;
@Override
public Outgoing process(Incoming incoming) {
//do process...
}
public void setStepScopeBeanTwo(StepScopeBeanTwo stepScopeBeanTwo) {
this.stepScopeBeanTwo = stepScopeBeanTwo;
}
public void setStepScopeBeanOne(StepScopeBeanOne stepScopeBeanOne) {
this.stepScopeBeanOne = stepScopeBeanOne;
}
//rest of class...
}
结果
org.springframework.beans.factory.unsatifieddependencyException:创建名为“scopedtarget.scopedtarget.processor”的bean时出错:通过字段“stepscopebeanone”表示的未满足的依赖关系;嵌套异常为org.springframework.beans.factory.nosuchbeandefinitionexception:没有类型为“stepscopebeanone”的限定bean可用:至少需要1个符合autowire候选的bean。依赖项注解:{@org.springframework.beans.factory.annotation.autowired(required=true)}
我的想法
我相信这与在解析处理器bean时bean stepscopebeanone不在applicationcontext中有关。
配置二(步骤范围bean的setter注入)
配置.java
@Configuration
@EnableBatchProcessing
public class Config {
@Bean
@StepScope
public StepScopeBeanOne stepScopeBeanOne() {
return new StepScopeBeanOne();
}
@Bean
@StepScope
public StepScopeBeanTwo stepScopeBeanTwo () {
return new StepScopeBeanTwo();
}
@Bean
@StepScope
public Processor processor() {
Processor processor = new Processor();
processor.setStepScopeBeanOne(stepScopeBeanOne());
processor.setStepScopeBeanTwo(stepScopeBeanTwo());
return processor;
}
}
处理器与配置相同
结果
org.springframework.beans.factory.beancreationexception:创建名为'scopedtarget.scopedtarget.processor'的bean时出错,该bean在类路径资源[config.class]中定义:通过工厂方法示例化bean失败;嵌套异常为org.springframework.beans.beaninstantiationexception:未能示例化[processor]:工厂方法“processor”引发异常;嵌套的异常是java.lang.illegalstateexception:@bean method config.stepscopebeanone作为[stepscopebeanone]类型的bean引用调用,但被[com.sun.proxy.$proxy149]类型的不兼容bean示例重写。重写在类路径资源[config.class]中定义的:beandefinition中声明的同名bean
我的想法
我以前遇到过这个问题,我的解决方法是为我注入的类创建一个接口。
public interface StepScopeBeanOne {
//methods
}
public class StepScopeBeanOneImpl implements StepScopeBeanOne {
//methods
}
我不想再走这条路了,因为我相信这会增加代码的复杂性。如果有人有不同的解决方案,请分享。
配置三(有效的配置)
从这些bean中删除step作用域将导致一个精细而漂亮的自动布线。
配置类
@Configuration
@EnableBatchProcessing
public class Config {
@Bean
public StepScopeBeanOne stepScopeBeanOne() {
return new StepScopeBeanOne();
}
@Bean
public StepScopeBeanTwo stepScopeBeanTwo () {
return new StepScopeBeanTwo();
}
@Bean
public Processor processor() {
Processor processor = new Processor();
return processor;
}
}
处理器相同
结果
bean是通过@autowiring注解注入的。
我的想法
你可能会问自己,为什么不删除@stepscope?好吧,我不能。我需要对这些bean中的每一个设置步骤范围,以便正确地注入jobparameters。我们在作业参数中使用步骤名称来提供微调的步骤配置。
总体
我的目标是让配置1工作。在这个目标之外,更好地理解 Spring 的bean创建将是非常感激的。
1条答案
按热度按时间biswetbf1#
我的目标是让配置1工作。
下面是一个基于“配置一”的完整示例:
这将打印以下输出,而不涉及步骤范围的bean或依赖项注入的任何问题: