在Java中,一个接口可以有多个实现(即多个类实现了同一个接口),这在面向对象编程(OOP)中是一种常见的模式,被称为“多态”。

这种模式的使用场景多种多样: 抽象和封装,策略模式,框架和库开发等。

多态性允许使用父类型引用变量来引用子类型的对象。通过接口实现多态,可以在运行时决定调用哪个类的具体方法。

那么,多个实现怎样保存在Spring容器?

1.定义多个实现

首先,确保你有多个实现了  IDealService 接口的bean定义在Spring容器中。

确保为每个实现提供一个唯一的bean名称 。 或者使用@Primary注解指定首选实现(仅一个)。

例如:

@Service("service1")

//@Component("service1")

public class DealServiceImpl1 implements IDealService {
    // 实现方法
}
 
@Service("service2")

//@Component("service2")
public class DealServiceImpl2 implements IDealService {
    // 实现方法
}

2.使用 @Autowired 注入 Map

在类中,使用@Autowired注解来注入一个Map,其键(Key)为bean的名称,值为相应bean实例。

Spring会自动注入所有匹配的bean。

例如:

@Service

public class SomeService {

        @Autowired

        private   Map<String, IDealService>   dealServiceMap;

        public void someMethod() {

                // 使用IDealService 

                 IDealService service1 = dealServiceMap.get("service1");

                service1.someMethod(); // 调用具体实现的方法

        }

}

3.使用 @Autowired 注入 List 所有实现

如果你想要注入接口的所有实现,可以使用@Autowired注解配合 List<IDealService>.

这样,Spring会自动注入所有匹配的bean。

@Component

public class YourComponent {

        private  final   List<IDealService>   dealServiceList;

        @Autowired

        public YourComponent(List<IDealService> dealServiceList) {

                this.dealServiceList= dealServiceList;

        }

}

4.使用 @Qualifier 指定具体实现注入

如果你只需要注入特定的实现,可以使用 @Qualifier 注解来指定。

首先,你需要为每个实现提供一个唯一的bean名称。

@Component

public class YourComponent {

        private final IDealService dealService;

        @Autowired

        public  YourComponent( @Qualifier("service1")   IDealService dealService)    {

                this.dealService= dealService;

        }

}

5.使用@Primary注解指定首选实现

使用@Primary注解指定首选实现。

@Component

@Primary

public  class  DefaultIDealServiceImpl  implements   IDealService{

                // 实现方法

}

注入使用就不需要@Qualifier

@Component

public class YourComponent {

        private final IDealService defaultIDealService;

        @Autowired

          // 这里不需要@Qualifier,因为 DefaultIDealServiceImpl 是默认的。

        public YourComponent(IDealService defaultIDealService)

                this.defaultIDealService= defaultIDealService;

        }

}

注意事项

  • 确保Bean名称匹配:注入的Map的键(即bean的名称)必须与你在@Service注解中指定的名称完全匹配。如果不匹配,Spring将无法找到相应的bean来注入到Map中。

  • 使用@Qualifier:如果你有多个相同类型的bean但想要指定注入哪一个,可以使用@Qualifier注解来指定。例如:

        @Autowired

        @Qualifier("specificServiceName")

        private Map<String, IDealService>   specificServices;

结论

通过这种方式,你可以灵活地管理和使用多个实现了同一接口的bean,使得代码更加模块化和易于维护。确保在使用时正确管理bean的名称和类型,以避免注入错误或运行时异常。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐