弹簧依赖注入,子项目提供接口实现

时间:2020-09-07 10:21:20

标签: java spring spring-boot

我有一个带有spring组件的父spring java项目:

@Component
public class MyJobRunner {

    private JobLauncher jobLauncher;
    private MyMapper mapper;

    @Autowired
    public MyJobRunner (JobLauncher jobLauncher, MyMapper mapper) {
        this.jobLauncher = jobLauncher;
        this.mapper= mapper;
    }

然后我有单独的项目,这些项目将这个父项目作为依赖项导入并使用上面的类。这些单独的项目需要提供MyMapper接口的实现,该接口应以@Component进行注释。

我的问题是我的父项目主应用程序失败,因为我没有实现,因此无法自动装配。

除了在父项目中提供默认实现之外,还有什么方法可以使应用程序启动和运行?如果我在父项目中提供默认实现但没有@Component,该怎么办。

之所以提出这个问题,是因为上述情况迫使我在所有单独的项目上添加@Primary,以覆盖父项目中的DefaultMapper实现,并且理想情况下,我希望避免使用@Primary忘记注释它。

//parent project 
@Component
public class DefaultMapper implements MyMapper {...}

//projectA
@Primary
@Component
public class ProjectAMapper implements MyMapper {...}

//projectB
@Primary
@Component
public class ProjectBMapper implements MyMapper {...}

1 个答案:

答案 0 :(得分:0)

您可以尝试用DefaultMapper注释@ConditionalOnMissingBean(MyMapper.class)。然后,仅当DefaultMapper中没有MyMapper的其他实现时,Spring才会创建BeanFactory