1.前提:if中条件固定,可以枚举出。
package com.gt.rig.testEnum;
import java.util.Map;
public interface DataSourceStrategy {
//每个策略的逻辑实现
Map<String, Object> connect(Map<String, String> params);
}
package com.gt.rig.testEnum;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface DataSourceType {
// 策略名
String asssss() default "" ;
}
package com.gt.rig.testEnum;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
@DataSourceType(asssss="faceRecognition")
public class FaceRecognition implements DataSourceStrategy {
@Override
public Map<String, Object> connect(Map<String, String> params) {
//返回结果
JSONObject json = new JSONObject();
json.put("type", "人脸识别");
json.put("status", "success");
return json;
}
}
package com.gt.rig.testEnum;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
@DataSourceType(asssss="fourElements")
public class FourElements implements DataSourceStrategy {
@Override
public Map<String, Object> connect(Map<String, String> params) {
//返回结果
JSONObject json = new JSONObject();
json.put("type", "四要素");
json.put("status", "success");
return json;
}
}
package com.gt.rig.testEnum;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.io.File;
import java.net.URL;
@Component
public class InitDataSource {
private String packageVo="com.gt.rig.testEnum";
@PostConstruct
public void initssss() {
initAllDataSourceType(packageVo);
}
private void initAllDataSourceType(String packageVo) {
URL url = this.getClass().getClassLoader().getResource(packageVo.replace(".", "/"));
File dir = new File(url.getFile());
for (File file : dir.listFiles()) {
if (file.isDirectory()) {
continue;
} else {
String className = packageVo + "." + file.getName().replace(".class", "");
try {
Class<?> clazz = Class.forName(className);// class cn.haoxy.ref.inter.impl.faceRecognition
//判断这个类上是否存在指定的注解
if (clazz.isAnnotationPresent(DataSourceType.class)) {
//如果存在,得到此注解的value值
DataSourceType dataSourceType = clazz.getAnnotation(DataSourceType.class);
//放入容器
CacheCollectionUtil.putClass(dataSourceType.asssss(), clazz);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
continue;
}
}
}
}
}
package com.gt.rig.testEnum;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class DataSourceContextAware implements ApplicationContextAware {
private ApplicationContext applicationContext;
/**
* 获取实例
* @param dsType
* @return 策略接口:DataSourceStrategy 的一个实例。
*/
public DataSourceStrategy getStrategyInstance(String dsType) {
Class clazz = CacheCollectionUtil.getDS(dsType);
DataSourceStrategy dataSourceStrategy = (DataSourceStrategy) applicationContext.getBean(clazz);
return dataSourceStrategy;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
package com.gt.rig.testEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class DataSourceService {
@Autowired
private DataSourceContextAware dataSourceContextAware;
public Map<String, Object> connect(String dsType, Map<String, String> map) {
DataSourceStrategy dataSourceChild = dataSourceContextAware.getStrategyInstance(dsType);
return dataSourceChild.connect(map);
}
}
package com.gt.rig.testEnum;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class CacheCollectionUtil {
private static Map<String, Class> ALL_DATA_SOURCE;
static {
ALL_DATA_SOURCE=new HashMap<>(100);
}
/**
* 根据策略名获取 Class
* @param dsType
* @return
*/
public static Class getDS(String dsType) {
return ALL_DATA_SOURCE.get(dsType);
}
/**
* 策略名为 key,Class 为 value
*/
public static void putClass(String dsType,Class clazz){
ALL_DATA_SOURCE.put(dsType,clazz);
}
}
测试类
package com.gt.rig.service;
import com.gt.rig.constant.NumberConstant;
import com.gt.rig.testEnum.DataSourceService;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.configurationprocessor.json.JSONException;
import org.springframework.boot.configurationprocessor.json.JSONObject;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.HashMap;
import java.util.Map;
/**
* @DATE:2020/12/10 11:18
* @Author:robin
*/
@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class PoiTest {
@Autowired
DataSourceService dataSourceService;
@Test
public void testOperation(){
Map<String, Object> resp = dataSourceService.connect("faceRecognition", new HashMap<>());
// Map<String, Object> resp = dataSourceService.connect("fourElements", new HashMap<>());
System.out.println(resp);
}
}