1、编写接口FactoryList
import java.util.List;
public interface FactoryList, K> extends List {
E getBean(K factor);
List getBeanList(K factor);
}
2、编写抽象类FactoryArrayList
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.OrderComparator;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class FactoryArrayList, K> extends ArrayList
implements FactoryList, InitializingBean, Serializable {
public FactoryArrayList() {
super();
}
public FactoryArrayList(int size) {
super(size);
}
public E getBean(K factor) {
Iterator itr = iterator();
while (itr.hasNext()) {
E beanMatch = itr.next();
if (beanMatch.matching(factor)) {
return beanMatch;
}
}
return null;
}
public List getBeanList(K factor) {
Iterator itr = iterator();
while (itr.hasNext()) {
E beanMatch = itr.next();
if (!beanMatch.matching(factor)) {
itr.remove();
}
}
return this;
}
public void afterPropertiesSet() throws Exception {
if (!isEmpty()) {
Object[] a = toArray();
OrderComparator.sort(a);
ListIterator i = listIterator();
for (int j = 0; j < a.length; j++) {
i.next();
i.set(a[j]);
}
}
}
}
3、实现接口MatchingBean
public interface MatchingBean {
boolean matching(K factor);
}
4、应用
@Service
public class VendorsHelper {
@Resource
FactoryList, VendorReq> vendorServices;
@SuppressWarnings("unchecked")
public List extends VendorResp> fetchVendors(VendorReq vendorReq){
IVendorService instance = vendorServices.getBean(vendorReq);
if(instance == null){
return Collections.emptyList();
}
return instance.wannaVendors(vendorReq);
}
}
5、细节纰漏
import java.util.List;
import com.ysma.intf.entity.VendorResp;
import com.ysma.intf.entity.base.ioc.list.MatchingBean;
import com.ysma.intf.entity.vendor.VendorReq;
public interface IVendorService extends MatchingBean{
/**定义必要功能*/
List extends VendorResp> wannaVendors(VendorReq vendorReq);
}
import com.ysma.intf.entity.vendor.VendorReq;
import com.ysma.intf.entity.vendor.VendorEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 抽象类:实现筛选甄别
* Created by ysma on 2018/11/19.
*/
public abstract class VendorService implements IVendorService{
protected final Logger LOGGER = LoggerFactory.getLogger(VendorService.class);
@Override
public boolean matching(T t) {
if(t instanceof VendorReq){
VendorApisReq req = (VendorReq)t;
VendorEnum ve = support();
return req.getSys().equals(ve.getSys());
}
return false;
}
abstract VendorEnum support();
}
@Service
public class SubVendorService extends VendorService {
@Autowired
private VendorSubMapper vendorSubMapper;
/***
* 查询mac供应商
* @param vendorReq req
* @return vendors
*/
@Override
@DB(dbName = DbEnum.MAC, readOnly = true)
public List wannaVendors(VendorReq vendorReq) {
vendorSubMapper.fetchAllVendors();
//bizz logic
}
@Override
VendorEnum support() {
return VendorEnum.OPC;
}
}
import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;
@Data
public class VendorReq {
@NotBlank(message = "查询条件matchValue不能为空")
private String matchValue;
@NotBlank(message = "系统码sys不能为空")
private String sys;
}
public enum VendorEnum {
OPC("MAC", "MAC"),
OPA("MAA", "MAA"),
GTB("MAB", "MAB"),
AOP("MAP", "MAP"),
UNKNOWN("UNKNOWN", "UNKNOWN");
private String sys;
private String name;
VendorEnum(String sys, String name) {
this.sys = sys;
this.name = name;
}
public static VendorEnum getSys(String index) {
for (VendorEnum ve : values()){
if(index.equals(ve.getSys())){
return ve;
}
}
return UNKNOWN;
}
public String getSys() {
return sys;
}
}