Spring构造注入自动装配问题:如何规避硬编码与new关键字
解决方案
要解决这个问题,核心是让Spring接管ScienceFilenameMetadataProcessor的实例化,同时动态绑定指定的FilenameParser实现,避免硬编码和new关键字。以下是具体实现步骤:
步骤1:调整ScienceFilenameMetadataProcessor类
移除类上的@Component注解,避免Spring自动扫描时因无法确定FilenameParser实现而抛出异常:
public class ScienceFilenameMetadataProcessor extends ScienceBasicFileProcessor implements Processor { private final FilenameParser parser; // 保留构造注入,依赖接口而非具体实现 public ScienceFilenameMetadataProcessor(FilenameParser parser) { this.parser = parser; } }
步骤2:通过配置类创建绑定特定Parser的Processor Bean
创建一个Spring配置类,显式为每个需要的FilenameParser实现定义对应的ScienceFilenameMetadataProcessor Bean,确保两者的绑定关系:
@Configuration public class ProcessorConfig { // 绑定cdfFileNameParser到Processor @Bean("cdfScienceProcessor") public ScienceFilenameMetadataProcessor cdfScienceProcessor( @Qualifier("cdfFileNameParser") FilenameParser filenameParser) { return new ScienceFilenameMetadataProcessor(filenameParser); } // 如果需要其他Parser实现,可添加类似Bean定义 @Bean("txtScienceProcessor") public ScienceFilenameMetadataProcessor txtScienceProcessor( @Qualifier("txtFileNameParser") FilenameParser filenameParser) { return new ScienceFilenameMetadataProcessor(filenameParser); } }
步骤3:在目标类中注入指定的Processor Bean
在SoarScienceCdfFileRouteBuilder中,直接通过@Qualifier注入配置好的ScienceFilenameMetadataProcessor Bean,完全避免new关键字:
public class SoarScienceCdfFileRouteBuilder { private final ScienceFilenameMetadataProcessor scienceFilenameMetadataProcessor; @Autowired public SoarScienceCdfFileRouteBuilder( @Qualifier("cdfScienceProcessor") ScienceFilenameMetadataProcessor processor) { this.scienceFilenameMetadataProcessor = processor; } }
可选:灵活获取多个Processor实例
如果需要在同一个类中使用多个不同的Processor,可注入Map<String, ScienceFilenameMetadataProcessor>,Spring会自动将所有Processor Bean按名称存入Map,按需取用:
public class MultiProcessorUsage { private final Map<String, ScienceFilenameMetadataProcessor> processorMap; @Autowired public MultiProcessorUsage(Map<String, ScienceFilenameMetadataProcessor> processorMap) { this.processorMap = processorMap; } // 使用时通过Bean名称获取对应的Processor public void handleCdfFile() { ScienceFilenameMetadataProcessor processor = processorMap.get("cdfScienceProcessor"); // 业务逻辑处理 } }
内容的提问来源于stack exchange,提问作者user1472672
相关产品推荐
相关产品推荐

