Bean条件注入

  • IHandler
    1
    2
    3
    public interface IHandler {
    String handle(String param);
    }
    • AHandlerImpl
      1
      2
      3
      4
      5
      6
      7
      8
      9
      @Slf4j
      @Component
      public class AHandlerImpl implements IHandler {
      @Override
      public String handle(String param) {
      log.info("exec A");
      return "A";
      }
      }
    • BHandlerImpl
      1
      2
      3
      4
      5
      6
      7
      8
      9
      @Slf4j
      @Component
      public class BHandlerImpl implements IHandler {
      @Override
      public String handle(String param) {
      log.info("exec B");
      return "B";
      }
      }

controller使用到IHandler

1
2
@Autowired
private IHandler handler;
  1. Bean重复问题
    此时会报错,因为Spring不知道controller需要的IHandlerAHandlerImplBHandlerImpl中哪一个
    这时候只需要在AHandlerImplBHandlerImpl上随便选择一个加上@Primary注解即可解决报错问题

  2. 在某种条件下实现Bean注入

  • 有了BHandlerImpl就注入BHandlerImpl,否则就注入默认的AHandlerImpl
    AHandlerImpl上添加@ConditionalOnMissingBean注解,例如:
    1
    2
    3
    4
    @Component
    @ConditionalOnMissingBean(IHandler.class) // 只要存在实现IHandler接口的Bean,AHandlerImpl就不会注入进去
    public class AHandlerImpl implements IHandler {
    }

Conditional的解析发生在