# 第6节.Nacos中多个子类容器注入冲突问题设计
经常做开发的时候,经常会遇到一个接口或多个实现类的情况,当我们使用@Autowire注解的时候,如果当前接口存在多个实现类的情况,那么很有可能在启动时提示接口实现注入冲突的情况,一般场景的解决方案是加上@Qualifier注解来解决。这种办法也是我们解决之一。这种情况适合于当前业务实现子类可能会同时需要加入到IOC的容器中的需求。
而在某些场景中,可能会存在在多个子类启动时根据条件进行注入的情况,不同的条件决定提供什么样的Bean类型。比如在Nacos中,有这样的类:
PersistService
EmbeddedStoragePersistServiceImpl
ExternalStoragePersistServiceImpl
外部模块使用的时候声明的类型为:PersistService,并且加上了Autowire注解,在子类实现上分别加上了Conditional的注解,指定了当前类生成的条件,示例代码如下:
外部数据源持久化:
@Conditional(value = ConditionOnExternalStorage.class)
@Component
public class ExternalStoragePersistServiceImpl implements PersistService {
......
}
其对应的判断逻辑为:
public class ConditionOnExternalStorage implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return !PropertyUtil.isEmbeddedStorage();
}
}
内嵌数据源持久化:
@Conditional(value = ConditionOnEmbeddedStorage.class)
@Component
public class EmbeddedStoragePersistServiceImpl implements PersistService {
....
}
其对应的判断逻辑为:
public class ConditionOnEmbeddedStorage implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return PropertyUtil.isEmbeddedStorage();
}
}
这样通过一个Condition的实现类,来觉得项目启动的时候该注入哪个Bean信息。
总结: 1、在某些情况的设计上,多个子类可以采用委派设计模式,进行多个子类实现的调用。
2、在某些情况的设计上,多个子类的注入可使用Qualifier注解来解决。
3、在某些情况的设计上,多个子类的注入可使用Condition的方式来解决。