Spring Boot自动装配具有多个实现的接口

新手上路,请多包涵

在正常的 Spring 中,当我们想要自动装配接口时,我们在 Spring 上下文文件中定义它的实现。

  1. 春季启动呢?
  2. 我们怎样才能做到这一点?

目前我们只自动装配不是接口的类。

这个问题的另一部分是关于在 Spring Boot 项目中的 Junit 类中使用一个类。

例如,如果我们想使用 CalendarUtil,如果我们自动装配 CalendarUtil,它将抛出一个空指针异常。在这种情况下我们能做什么?我现在刚刚使用“new”初始化……

原文由 user666 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 670
2 个回答

使用 @Qualifier 注解用于区分相同接口的bean

查看 Spring Boot 文档

此外,要注入同一接口的所有 bean,只需 autowire 接口的 List

(在 Spring/Spring Boot/SpringBootTest 中也是一样的)

下面的例子:

 @SpringBootApplication
public class DemoApplication {

public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
}

public interface MyService {

    void doWork();

}

@Service
@Qualifier("firstService")
public static class FirstServiceImpl implements MyService {

    @Override
    public void doWork() {
        System.out.println("firstService work");
    }

}

@Service
@Qualifier("secondService")
public static class SecondServiceImpl implements MyService {

    @Override
    public void doWork() {
        System.out.println("secondService work");
    }

}

@Component
public static class FirstManager {

    private final MyService myService;

    @Autowired // inject FirstServiceImpl
    public FirstManager(@Qualifier("firstService") MyService myService) {
        this.myService = myService;
    }

    @PostConstruct
    public void startWork() {
        System.out.println("firstManager start work");
        myService.doWork();
    }

}

@Component
public static class SecondManager {

    private final List<MyService> myServices;

    @Autowired // inject MyService all implementations
    public SecondManager(List<MyService> myServices) {
        this.myServices = myServices;
    }

    @PostConstruct
    public void startWork() {
        System.out.println("secondManager start work");
        myServices.forEach(MyService::doWork);
    }

}

}

对于您问题的第二部分, 请先/ 第二次 查看此有用的答案

原文由 tsarenkotxt 发布,翻译遵循 CC BY-SA 4.0 许可协议

如评论中所述,通过使用 @Qualifier 注释,您可以区分 文档 中描述的不同实现。

对于测试,您也可以使用同样的方法。例如:

     @RunWith(SpringRunner.class)
    @SpringBootTest
    public class MyClassTests {

        @Autowired
        private MyClass testClass;
        @MockBean
        @Qualifier("default")
        private MyImplementation defaultImpl;

        @Test
        public void givenMultipleImpl_whenAutowiring_thenReturnDefaultImpl() {
    // your test here....
    }
}

原文由 Urosh T. 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题