我是Spring社区的新手,我对减少方法注入参数的数量有疑问。
示例
配置类
@Configuration
public class CustomConfig {
@Bean
public Step readStep() {
return new MyObject();
}
@Bean
public Step validateStep() {
return new MyObject();
}
@Bean
public Step writeStep() {
return new MyObject();
}
}
工作班
public class SomeJob {
@Bean
public Job someServiceMethod(@Qualifier("readStep" Step readStep,
@Qualifier("writeStep" Step writeStep,
@Qualifier("validateStep" Step validateStep) {
//Do something
}
}
所以我想知道是否有一种方法可以将方法注入参数的数量减少到一个。例如,可能将CustomConfig.java作为参数而不是每个bean注入。
public class SomeJob {
@Bean
public Job someServiceMethod(CustomConfig config) {
config.readStep//etc
//Do something
}
}
答案 0 :(得分:1)
您可以使用已注入的所有必需bean创建@component。 将其命名为MyCustomJobCommonCOnfig,并将其用作一个方法参数。
答案 1 :(得分:1)
仅提供Grigoriev Nick答案的代码示例。
@Configuration
public class CustomConfig {
//Create a component injecting required beans into it.
@Getter
@Component
@RequiredArgsConstructor
public class JobConfig {
private final Step readStep;
private final Step validateStep;
private final Step writeStep;
}
@Bean
public Step readStep() {
return new MyObject();
}
@Bean
public Step validateStep() {
return new MyObject();
}
@Bean
public Step writeStep() {
return new MyObject();
}
}
public class SomeJob {
//Inject comonent into method.
@Bean
public Job someServiceMethod(JobConfig config) {
Step read = config.getReadStep(),
validate = config.getValidateStep(),
write = config.getWriteStep();
}
}
答案 2 :(得分:0)
您可以使用AnnotationConfigApplicationContext
。
为CustomConfig
中的每个bean添加一个名称:
@Bean(name="readStep")
public Step readStep() {
return new MyObject();
}
然后只需实例化一个AnnotationConfigApplicationContext
并使用register
方法(它接受一个bean配置类),然后使用getBean
方法来获取单个bean。
public class SomeJob {
@Bean
public Job someServiceMethod() {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicaionContext.register(CustomConfig.class);
applicationContext.refresh();
Step readStep = (Step) applicationContext.getBean("readStep");
}
}