二七零零 2021-10-11 23:53 采纳率: 66.7%
浏览 106
已结题

一个接口多个实现类,怎么通过yml配置和工厂模式动态获取对应的实现类?

一个接口多个实现类,怎么通过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;*/
    }



  • 写回答

3条回答 默认 最新

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

      • 系统已结题 10月23日
      • 已采纳回答 10月15日
      • 修改了问题 10月12日
      • 创建了问题 10月11日

      悬赏问题

      • ¥15 工具变量 时间序列相关问题
      • ¥15 正弦波的峰值查找算法
      • ¥15 关于lwip的pbuf数据提取问题
      • ¥50 请求关于BBS数据集的资源分享
      • ¥15 设计一份接口自动化测试报告
      • ¥15 手机安装kali后ifconfig 提示错误
      • ¥15 用C++求矩阵的特征值
      • ¥30 求解答(自动忽略本括号内容)
      • ¥15 根据C语言小型成绩管理系统画一个流程图
      • ¥15 Javaweb的增删改查