用spring原生注解来实现工厂-简单实用

用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


版权声明:本文为qq_28675967原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。