基于SpringBoot的策略模式多实现类注入(Map注入)
1前言
在业务处理的过程中遇见一个场景,图形Shape分A,B,C,他们都是对应的实现都是正删改查,但是不同的图形Shape对应的增删改查业务逻辑有存在差异,这个时候如果不想办法设计代码就会出现A,B,C三个图形Shape都要写一个对应接口(XXXserver),然后分别再去实现他们(XXXserverImpl),如果后来再增加一台图形Shape D,我们又要去重复相关接口和实现,不仅显得代码冗余,更是不好维护和管理,所以利用设计模式---策略模式就解决了这个问题。
2基础知识
2.1对@Autowired注解的理解
在平常使用中我们对@Autowired都是这样用
@Autowired private XXXService service;
解释说明:@Autowired是按照byType注入的(即按照bean的类型),当注入接口的时候我们都知道,他是注入的是这个接口的实现类,只不过引用是接口而已,当你调用其中的方法的时候,实质是调用接口实现的方法(多态原理),所以XXXService有多个实现类时,用上面代码块的方式进行注入,会报错。
3策略模式的引入
3.1代码展示:
3.1.1一个接口有多个实现
//接口 public interface Shape { void draw(); }
//实现1 @Service public class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } }
//实现2 @Serivce public class Circle implements Shape { @Override public void draw() { System.out.println("Inside Circle::draw() method."); } }
//实现3 @Service public class Square implements Shape { @Override public void draw() { System.out.println("Inside Square::draw() method."); } }
3.1.2 枚举类型
public enum SettingTypeEnum { RECTANGLE("1","Rectangle", "矩形"), SQUARE("2","Square", "正方形"), CIRCLE("3","Circle", "圆形"), ; public String code; //接口的实现类名 public String implement; //备注 public String desc; SettingTypeEnum(String code,String implement, String desc) { this.code = code; this.implement = implement; this.desc = desc; } }
3.3.3写工厂类获取实现类
注意:@Autowired把多个实现类注入Map是重点
@Component public class ShapeBeanFactory { @Autowired//关键在这个,原理:当一个接口有多个实现类的时候,key为实现类名,value为实现类对象 private Map<String, Shape> shapeMap; @Autowired//这个注入了多个实现类对象 private List<Shape> shapeList; public Shape getShape(String shapeType) { Shape bean1 = shapeMap.get(shapeType); System.out.println(bean1); return bean1; } }
3.3.4控制层(为了测试用,根据业务使用,不一定用在控制层)
@RestController public class control { @Autowired private ShapeBeanFactory factory; // 使用注解注入 @GetMapping("/drawMyShape") public String drawMyShape(){ shapeBeanFactoryDraw(); return "成功"; } private void shapeBeanFactoryDraw() { //根据业务逻辑查库或者其他逻辑确定了一个类型 String circle = SettingTypeEnum.CIRCLE.implement; //获取真正对象 Shape shapeInterface1 = factory.getShape(circle); shapeInterface1.draw(); } }
4 题外话
刚刚在2的解释说明中提到当一个接口有多个实现类的时候会报错,这个时候我们用上面的Map,List都可以解决这个问题,但是当我们调用实现方法的时候,如果不指明调用哪一个实现类的,还是不行,我们有没有在这种情况下直接明确调用某一个具体的实现类呢?肯定是有的,如下注解
@Qualifier("Rectangle") @Autowired Shape shape;
解释说明:@Qualifier("Rectangle")注解,参数是接口多实现的情况下某一实现类的名字
5完结
上一篇:
通过多线程提高代码的执行效率例子