使用spring的ioc实现简单工厂模式
有一个需求是这样的,有五家银行的数据需要进行从excel中读取,进行筛选,每一家的筛选逻辑是不一样的,创建了5个bean,现在需要通过解析excel的名称然后动态的进行获取bean对象
先不使用工厂模式来实现着一个功能
设计:
创建一个Map集合,key存放excel所需要匹配的名字,value是需要的bean对象
package com.picc.peek.dvp.filter;import com.picc.peek.dvp.service.BankBussinessType;
import com.picc.peek.dvp.service.impl.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;import java.util.HashMap;
import java.util.Map;
import java.util.Set;/*** @author luodong* @date 2020/9/9 下午3:41*/
@Service
public class BankTypeKV {@Autowired@Qualifier("gh")GhBussinessType ghBussinessType;@Autowired@Qualifier("nh")NhBussinessType nhBussinessType;@AutowiredMBFBussinessType mbfBussinessType;@AutowiredYBCBussinessType ybcBussinessType;@AutowiredYBNBussinessType ybnBussinessType;@Autowired@Qualifier("gd")GDBussinessType gdBussinessType;@Autowired@Qualifier("jh")JHBussinessType jhBussinessType;@Autowired@Qualifier("jg")GDJGBussinessType gdjgBussinessType;public BankBussinessType creatKV(String name) {Map<String, BankBussinessType> map = new HashMap<>();map.put("工行", ghBussinessType);map.put("农行", nhBussinessType);map.put("麦保付", mbfBussinessType);map.put("易宝车", ybcBussinessType);map.put("易宝农", ybnBussinessType);map.put("光大", gdBussinessType);map.put("交行", jhBussinessType);map.put("监管", gdjgBussinessType);return this.match(name, map);}public BankBussinessType match(String name, Map<String, BankBussinessType> map) {Set<Map.Entry<String, BankBussinessType>> entries = map.entrySet();for (Map.Entry<String, BankBussinessType> ms : entries) {if (name.contains(ms.getKey())) {if(name.contains("光大")){if(name.contains("监管")){return map.get("监管");}}return ms.getValue();}}return null;}
}
读取到excle文件名称之后,将他传递给creatKV这个方法,筛选得到具体我们需要的bean对象
这样是可以实现这样的需求,但是如果在来一家,我们就需要去修改他的筛选逻辑,就需要进行测试,这样不符合开发的规范(关闭修改,支持扩展)
那么就是用工厂模式
创建一个工厂类,实现ApplicationContextAware接口
ApplicationContextAware接口的作用就是,如果一个类实现了ApplicationContextAware这个就口,这个类就可以获取ApplicationContext中所有的bean
当然,我们创建的五家银行的bena也在内
package com.picc.peek.dvp.filter;import com.picc.peek.dvp.service.BankBussinessType;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;import java.util.HashMap;
import java.util.Map;@Component
public class BankFlowFilterFactory implements ApplicationContextAware {private static Map<Object, BankBussinessType> bankFlowFilterBeanM;public static <T extends BankBussinessType> T getBankFilterBean(String serviceName) {T t = (T) bankFlowFilterBeanM.get(serviceName);return t;}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {Map<String, BankBussinessType> map = applicationContext.getBeansOfType(BankBussinessType.class);bankFlowFilterBeanM = new HashMap<>(map.size());map.forEach((key, value) -> bankFlowFilterBeanM.put(value.getFilterBeanName(), value));}
}
调用setApplicationContext 方法是将五家银行存放到一个map中
他的key是 下面return出来的
然后将其存放到 Map
@Service
public class MBFBussinessType implements BankBussinessType {@AutowiredBankFlowMaibaofuMapper bankFlowMaibaofuMapper;@Overridepublic String getFilterBeanName() {return "麦宝付";}@Overridepublic void filter(String fileurl) {// 业务方法:}
}
他的static方法getBankFilterBean 只要传入controller解析之后的excel名称就会在map中通过key获取对应的value值
BankFlowFilterFactory.getBankFilterBean(result).filter(fileurl);
bean的父接口
package com.picc.peek.dvp.service;import org.apache.poi.ss.formula.functions.T;import java.util.List;public interface BankBussinessType {public String getFilterBeanName();public void filter(String fileurl);
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
