用spring原生注解来实现工厂-简单实用
前言
这阵子在看业务代码,看到好多地方用了策略+工厂的结合使用 , 大部分用的是建立个工厂类,然后工厂类里面用的是map和enum组合使用,获取bean id,然后通过上下文获取实例
其实可以有更简化的写法,怎么简单怎么来
快速以最简单的方式实现(demo)
接口:
/**
邮件服务
@Author David.liu
@Date 2021/9/16 10:24
@Version 1.0
*/
public interface EmailService {/**
- 发送邮件
*/
void sendEmail();
- 发送邮件
}
实现类:
/**
- 新浪邮箱
- @Author David.liu
- @Date 2021/9/16 10:31
- @Version 1.0
/
@Service
public class SinaEmailService implements EmailService {
/*- 发送邮件
*/
@Override
public void sendEmail() {
System.out.println(“通过新浪邮箱发送邮件”);
}
}
- 发送邮件
@Service
public class GmailServiceImpl implements EmailService {
/**
* 发送邮件
*/
@Override
public void sendEmail() {
System.out.println(“通过谷歌邮箱发送邮件”);
}
}
@Service
public class BaiduEmailServiceImpl implements EmailService {
/**
* 发送邮件
*/
@Override
public void sendEmail() {
System.out.println("通过百度邮件发送邮件");
}
}
业务类:
public interface CompanyEmailService {
/**
* 发送通知到客户
*/
void sendNotifyToCustom(String emailType);
}
业务实现类:
@Service
public class CompanyEmailServiceImpl implements CompanyEmailService {
// 关键功能 Spring 会自动将 EmailService 接口的类注入到这个Map中
// 前提是你这个实现类得是交给Spring 容器管理的
@Autowired
private Map<String, EmailService> emailServiceMap;
/**
* 发送通知到客户
*/
@Override
public void sendNotifyToCustom(String emailType) {
EmailService emailService = emailServiceMap.get(emailType);
emailService.sendEmail();
}
}
说明:String emailType 这个类型实际上是bean id的值,但是实际业务入参是不会传这种类型的
程序怎么识别解析这个标识,找到对应的策略实现类,应该是根据你的业务需求定制的。所以最常用的就是enum枚举做中间层进行转换,
增加个枚举类
public enum EmailEnum {
BAIDU_EMAIL(“00”,“baiduEmailServiceImpl”),
GMAIL_EMAIL(“01”,“gmailServiceImpl”),
SINA_EMAIL(“02”,“sinaEmailService”)
;
private String code;
private String desc;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
EmailEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
/**
* 根据code取desc
* @param code
* @return
*/
public static String getDesc(String code){
for(EmailEnum c : EmailEnum.values()){
if(c.getCode().equals(code)){
return c.getDesc();
}
}
return "";
}
}
改造后的业务实现类:
@Service
public class CompanyEmailServiceImpl implements CompanyEmailService {
// 关键功能 Spring 会自动将 EmailService 接口的类注入到这个Map中
@Autowired
private Map<String, EmailService> emailServiceMap;
/**
* 发送通知到客户
*/
@Override
public void sendNotifyToCustom(String emailType) {
EmailService emailService = emailServiceMap.get(EmailEnum.getDesc(emailType));
emailService.sendEmail();
}
}
优点:
这样不仅仅结构清晰,而且还能少写代码,少写代码意味着可以少出bug
前言
这阵子在看业务代码,看到好多地方用了策略+工厂的结合使用 , 大部分用的是建立个工厂类,然后工厂类里面用的是map和enum组合使用,获取bean id,然后通过上下文获取实例
其实可以有更简化的写法,怎么简单怎么来
快速以最简单的方式实现(demo)
接口:
/**
邮件服务
@Author David.liu
@Date 2021/9/16 10:24
@Version 1.0
*/
public interface EmailService {/**
- 发送邮件
*/
void sendEmail();
- 发送邮件
}
实现类:
/**
- 新浪邮箱
- @Author David.liu
- @Date 2021/9/16 10:31
- @Version 1.0
/
@Service
public class SinaEmailService implements EmailService {
/*- 发送邮件
*/
@Override
public void sendEmail() {
System.out.println(“通过新浪邮箱发送邮件”);
}
}
- 发送邮件
@Service
public class GmailServiceImpl implements EmailService {
/**
* 发送邮件
*/
@Override
public void sendEmail() {
System.out.println(“通过谷歌邮箱发送邮件”);
}
}
@Service
public class BaiduEmailServiceImpl implements EmailService {
/**
* 发送邮件
*/
@Override
public void sendEmail() {
System.out.println("通过百度邮件发送邮件");
}
}
业务类:
public interface CompanyEmailService {
/**
* 发送通知到客户
*/
void sendNotifyToCustom(String emailType);
}
业务实现类:
@Service
public class CompanyEmailServiceImpl implements CompanyEmailService {
// 关键功能 Spring 会自动将 EmailService 接口的类注入到这个Map中
// 前提是你这个实现类得是交给Spring 容器管理的
@Autowired
private Map<String, EmailService> emailServiceMap;
/**
* 发送通知到客户
*/
@Override
public void sendNotifyToCustom(String emailType) {
EmailService emailService = emailServiceMap.get(emailType);
emailService.sendEmail();
}
}
说明:String emailType 这个类型实际上是bean id的值,但是实际业务入参是不会传这种类型的
程序怎么识别解析这个标识,找到对应的策略实现类,应该是根据你的业务需求定制的。所以最常用的就是enum枚举做中间层进行转换,
增加个枚举类
public enum EmailEnum {
BAIDU_EMAIL(“00”,“baiduEmailServiceImpl”),
GMAIL_EMAIL(“01”,“gmailServiceImpl”),
SINA_EMAIL(“02”,“sinaEmailService”)
;
private String code;
private String desc;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
EmailEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
/**
* 根据code取desc
* @param code
* @return
*/
public static String getDesc(String code){
for(EmailEnum c : EmailEnum.values()){
if(c.getCode().equals(code)){
return c.getDesc();
}
}
return "";
}
}
改造后的业务实现类:
@Service
public class CompanyEmailServiceImpl implements CompanyEmailService {
// 关键功能 Spring 会自动将 EmailService 接口的类注入到这个Map中
@Autowired
private Map<String, EmailService> emailServiceMap;
/**
* 发送通知到客户
*/
@Override
public void sendNotifyToCustom(String emailType) {
EmailService emailService = emailServiceMap.get(EmailEnum.getDesc(emailType));
emailService.sendEmail();
}
}
优点:
这样不仅仅结构清晰,而且还能少写代码,少写代码意味着可以少出bug