工厂类自动初始化
Spring 容器会自动把所有实现了EsignContractService
接口的 bean(例如上面的TypeAContractService
和TypeBContractService
)收集起来,形成一个列表。之后,Spring 容器会调用EsignContractServiceFactory
的构造器,并将这个列表作为参数传入
@Component
public class EsignContractServiceFactory {
private Map<Integer, EsignContractService> map;
public EsignContractServiceFactory(List<EsignContractService> contractServices) {
map = new HashMap<>();
for (EsignContractService item : contractServices) {
map.put(item.businessType(), item);
}
}
public EsignContractService getService(Integer contractType){
return map.get(contractType);
}
// 其他方法
}
实现业务类型接口
需要定义多个实现了EsignContractService
接口的服务类,并且为每个服务类指定对应的业务类型。
@Service
public class TypeAContractService implements EsignContractService {
@Override
public Integer businessType() {
return 1; // 业务类型A对应类型1
}
// 其他方法实现
}
@Service
public class TypeBContractService implements EsignContractService {
@Override
public Integer businessType() {
return 2; // 业务类型B对应类型2
}
// 其他方法实现
}
使用工厂获取服务
在需要使用服务的地方,你可以通过依赖注入的方式获取EsignContractServiceFactory
,然后根据业务类型来获取对应的服务实现。
@Service
public class MyService {
private final EsignContractServiceFactory factory;
@Autowired
public MyService(EsignContractServiceFactory factory) {
this.factory = factory;
}
public void processContract(Integer contractType) {
EsignContractService service = factory.getService(contractType);
// 使用获取到的服务进行相应处理
}
}