在SpringBoot 2中最小化方法注入参数
我是Spring社区的新手,我对减少方法注入参数的数量有疑问 范例 配置类在SpringBoot 2中最小化方法注入参数,spring,spring-boot,Spring,Spring Boot,我是Spring社区的新手,我对减少方法注入参数的数量有疑问 范例 配置类 @Configuration public class CustomConfig { @Bean public Step readStep() { return new MyObject(); } @Bean public Step validateStep() { return new MyObject(); } @Bean
@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
}
}
职业类别
@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
}
}
您可以使用
注释ConfigApplicationContext
在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");
}
}
您可以使用
注释ConfigApplicationContext
在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");
}
}
您可以创建@component,其中已经注入了所有必需的bean。
将其命名为MyCustomJobCommonCOnfig,并将其用作一个方法参数。您可以创建@component,其中已注入所有必需的bean。
将其命名为MyCustomJobCommonCOnfig,并将其用作一个方法参数。仅为Grigoriev Nick answer提供一个代码示例
@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();
}
}
仅提供Grigoriev Nick answer的代码示例
@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();
}
}
从我对Spring的观点来看,我们可以用一个责任将项目分成几个小部分,但您正在尝试做一些事情。奇怪,你为什么要这么做?@Alexey Usharovsk我正在使用spring批处理,我有很多作业,其中一个配置类在作业之间有一些共享bean。当我创建我的作业bean时,我需要将这些共享bean放到我的作业配置中。实际共享的bean是Step的。我的问题已经澄清了一点。从我对Spring的观点来看,我们可以将项目拆分为一个负责的小bean,但您正在尝试做一些事情。奇怪,你为什么要这么做?@Alexey Usharovsk我正在使用spring批处理,我有很多作业,其中一个配置类在作业之间有一些共享bean。当我创建我的作业bean时,我需要将这些共享bean放到我的作业配置中。实际共享的bean是Step的。我的问题稍微澄清了一点。这似乎接近我想要的,您能提供一个示例代码来演示这个选项吗?我会继续使用配置注释中的CustomConfig,并使用组件注释创建一个额外的类MyCustomjob,然后将所有必需的bean注入到组件中吗?或者,这可以在配置类中使用组件注释而不是配置注释来完成吗?我的意思是,您可以只创建一个bean/coComponent,并在其中注入您想要的所有bean。您可以在单独的文件中创建一个单独的类,或者在同一文件中创建另一个带有子类的方法注释bean。没关系,只要你觉得方便就做吧。我总是忘记春天的豆子概念。谢谢。这似乎接近我想要的,你能提供一些示例代码来演示这个选项吗?我会继续使用配置注释使用我的CustomConfig,并使用组件注释创建一个额外的类MyCustomjob,然后将我所需的所有bean注入组件吗?或者,这可以在配置类中使用组件注释而不是配置注释来完成吗?我的意思是,您可以只创建一个bean/coComponent,并在其中注入您想要的所有bean。您可以在单独的文件中创建一个单独的类,或者在同一文件中创建另一个带有子类的方法注释bean。没关系,只要你觉得方便就做吧。我总是忘记春天的豆子概念。谢谢。这看起来比我已经在做的更复杂。Grigoriev Nick似乎认为我可以使用@Component并注入该组件,因此我希望看到一个关于如何做到这一点的小示例,但可能要简单得多。我只是想对您作为答案添加的代码发表评论,我在这里发表了评论,因为我还不能对其他答案发表评论。您正在将bean实例化为对象,而不是spring bean,因此在注入JobConfig之前,您需要为JobConfig中的每个对象使用@Autowired,还需要为这些bean创建一个单独的类(而不是内部类),就像Grigoriev Nick提到的那样。如果我没有弄错的话,RequiredArgsConstructor正在为我自动处理Autowired。我知道lombok正在使用构造函数注入。代码似乎在测试中正常工作,没有任何问题。如果没有autowire,这还能用吗?我明白了。我不知道RequiredArgsConstructor,它处理构造函数连接。是的,我喜欢它清理代码的方式。除了删除内部类之外,您还有其他建议吗?这似乎比我正在做的更复杂。Grigoriev Nick似乎认为我可以使用@Component并注入该组件,因此我希望看到一个关于如何做到这一点的小示例,但可能要简单得多。我只是想对您作为答案添加的代码发表评论,我在这里发表了评论,因为我还不能对其他答案发表评论。您正在将bean实例化为对象,而不是spring bean,因此在注入JobConfig之前,您需要为JobConfig中的每个对象使用@Autowired,还需要为这些bean创建一个单独的类(而不是内部类),就像Grigoriev Nick提到的那样。如果我没有弄错的话,RequiredArgsConstructor正在为我自动处理Autowired。我知道lombok正在使用构造函数注入。代码似乎在测试中正常工作,没有任何问题。如果没有autowire,这还能用吗?我明白了。我一点也不知道