# 第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的方式来解决。

Last Updated: 10/3/2022, 5:50:00 PM