Spring - 以编程方式访问服务接口

时间:2018-04-19 15:30:03

标签: spring

我有几个扩展单个界面的接口。

我需要在@PostCostruct方法中将这些接口添加到Map。

问题是我需要从数据库中检索@Service类名,我不知道将接口放在地图中...

我会尝试更好地解释

我有一般服务界面

public interface IVehicleServiceGeneral{

//methods...
}

然后我有几个接口扩展了一般接口。

public interface IService1 extends IVehicleServiceGeneral{
}

public interface IService2 extends IVehicleServiceGeneral{
}

这些类的具体实现使用@Service(“service1Name”),@ Service(“service2Name”)等注释......

然后从数据库中检索我的供应商

public class Supplier {

private long id;

private String serviceName;

//getters and setters
}

最后我需要创建地图,因为我需要在运行时基于供应商访问实现,我创建了一个ContextAware类来获取我的bean名称,但接口不是bean ...我也试过将@Qualifier放在界面上,但显然它不起作用......如何将界面放在地图中?

@PostConstruct
    private void createServiceMap(){

        serviceMap = new HashMap<OBUSupplier, IVehicleServiceGeneral>();
        List<Supplier> suppliers = supplierService.findAll();
        for(Supplier s : suppliers) {
            serviceMap.put(s, contextAware.getBean(s.getServiceName()));

        }

    }

1 个答案:

答案 0 :(得分:0)

您可以像这样创建IVehicleServiceGeneral实例映射:

class SomeClass {
   Map vehicleServiceGeneralInstanceMap = new HashMap();

   SomeClass(Set<IVehicleServiceGeneral> instances) {
      instances.forEach(i -> vehicleServiceGeneralInstanceMap.put(i.getServiceName(), i));
   }    


   private void createServiceMap() {
       Map serviceMap = new HashMap<OBUSupplier, IVehicleServiceGeneral>();
       List<Supplier> suppliers = supplierService.findAll();
       for(Supplier s : suppliers) {
           serviceMap.put(s, vehicleServiceGeneralInstanceMap.get(s.getServiceName()));

   }
}

您唯一需要的是IVehicleServiceGeneral#getServiceNameService1, 2需要使用DB中的专有名称覆盖。