一个接口多个实现类,怎么通过yml配置和工厂模式动态获取对应的实现类?
我们主管跟我说,自定义一个注解,通过工厂来包装,最后只需要在yml里面配置参数,需要获取那个实现类就配置一下,但是做到下面了,就是不明白主管跟我说的到底要怎么做,
主管还提到了用ApplicationContext通过注解获取注解类的方法,
但是始终自己连贯不起来,请求解惑。非常感谢!!
我最终想实现的是,工厂类不变,如果我要新增一个DImpl实现类,直接在yml里面配置参数对应的值D,新增D实现类,这样业务代码里面就可以通过工厂来得到D的实现类,调D中的方法
// 一个接口
public interface SendSmsService {
RetData<SmsageVO> sendSmsMessage(SmsInVO smsInVO);
}
A实现类
@Service
@Slf4j
public class ASendSmsServiceImpl implements SendSmsService {
@Override
public RetData<SmsageVO> sendSmsMessage(SmsInVO smsInVO) {........}
B实现类
@Service
@Slf4j
public class BSendSmsServiceImpl implements SendSmsService {
@Override
public RetData<SmsageVO> sendSmsMessage(SmsInVO smsInVO) {........}
C实现类
@Service
@Slf4j
public class CSendSmsServiceImpl implements SendSmsService {
@Override
public RetData<SmsageVO> sendSmsMessage(SmsInVO smsInVO) {........}
定义一个工厂类
@Component
public class SmsFactory {
private static SendSmsService sendSmsService;
@Autowired
private static ASendSmsServiceImpl aSendSmsService;
@Autowired
private static BSendSmsServiceImpl BSendSmsService;
@Autowired
private static CSendSmsServiceImpl cSendSmsService;
@Value("${message.center.smsOperator}")
static String smsOperator;
@Autowired
static Map<String,SendSmsService> serviceMap;
public static SendSmsService getSmsServiceImpl() {
serviceMap.put("A",aSendSmsService);
serviceMap.put("B",bSendSmsService);
serviceMap.put("C",cSendSmsService);
SendSmsService smsService = serviceMap.get(smsOperator);
return smsService;
/* if (smsOperator == null) {
return null;
}
SendSmsService sendSmsService = null;
switch (smsOperator) {
case "A":
sendSmsService = new ASendSmsServiceImpl();
break;
case "B":
sendSmsService = new BSendSmsServiceImpl();
break;
case "C":
sendSmsService = new CSendSmsServiceImpl();
break;
default:
break;
}
return sendSmsService;*/
}