这里使用发短信业务:
//策略接口
public interface SmsTemStrategy {
public void sendSms(Map<String,String> params);
}
//自定义策略名
@Component(value = "LoginSmsTempwwww")
public class LoginSmsTemp implements SmsTemStrategy{
@Autowired
SendServiceSmsImpl sendServiceSms;
//短信模板场景
private static final String scene="login";
/**
*
*/
@Override
public void sendSms(Map<String,String> params) {
String template = sendServiceSms.getTemplate(scene);
params.put("template",template);
System.out.println(sendServiceSms.sendSms(params));
}
}
注册短信模板
@Component(value = "register")
public class RegisterSmsTemp implements SmsTemStrategy{
@Autowired
SendServiceSmsImpl sendServiceSms;
private static final String scene="register";
/**
*发送短信
*/
@Override
public void sendSms(Map<String,String> params) {
//获取短信模板
String template = sendServiceSms.getTemplate(scene);
params.put("template",template);
//发送短信
System.out.println(sendServiceSms.sendSms(params));
}
}
@Component
public class SendServiceSmsImpl implements SendServiceSms {
/**
*通过场景获取短信模板接口
*/
@Override
public String getTemplate(String str) {
return "获取"+str+"模板成功";
}
/**
*发送短信接口
*/
@Override
public String sendSms(Map<String,String> params) {
return "发送短信成功"+params;
}
}
Spring会自动将Strategy接口的实现类注入到这个Map中(前提是实现类得是交给Spring 容器管理的),这个Map的key为bean的id,这个ID可以用@Component(value = “xxx”)的方式设置,如果直接用默认的方式的话,就是首字母小写。value值则为对应的策略实现类
@Component
public class SmsFactory {
//这里Spring会将所有的类都注册到这里
@Autowired
Map<String,SmsTemStrategy> smsTemStrategyMap;
//通过bean的name获取
public SmsTemStrategy getBy(String strategyName) {
return smsTemStrategyMap.get(strategyName);
}
}
工厂类Map自动注入结果如图:
