该文章是通过在云析学院的老师讲解终结的。
场景描述:
通过接口封装,以及反射机制,和注解的方式。实现接口mapping对接。
1创建统一接口Strategy
package com.fwf.pay;
import java.math.BigDecimal;
/**
* Created by Administrator on 2018/5/27.
*/
public interface Strategy {
/***
* @method 方法描述: 计算支付金额,通过渠道Id和商品id 调用各自的银行的报文进场封装
* @param changeId
* @param goodsId
* @return
*/
BigDecimal calRecharge(Integer changeId,Integer goodsId);
}
2实现接口Strategy的CMBPay
package com.fwf.pay.impl;
import com.fwf.pay.InitNewService;
import com.fwf.pay.Pay;
import com.fwf.pay.Strategy;
import java.math.BigDecimal;
/**
* Created by Administrator on 2018/5/27.
*/
@Pay(2)
public class CMBPay extends InitNewService implements Strategy {
/***
* @method 方法描述: 计算支付金额,通过渠道Id和商品id 调用各自的银行的报文进场封装
* @param changeId
* @param goodsId
* @return
*/
@Override
public BigDecimal calRecharge(Integer changeId, Integer goodsId) {
System.out.println("调用CMB接口:calRecharge("+changeId+","+"goodsId)");
return new BigDecimal(2) ;
}
}
3实现接口Strategy的
ICBCPay
package com.fwf.pay.impl;
import com.fwf.pay.InitNewService;
import com.fwf.pay.Pay;
import com.fwf.pay.Strategy;
import java.math.BigDecimal;
/**
* Created by Administrator on 2018/5/27.
*/
@Pay(1)
public class ICBCPay extends InitNewService implements Strategy {
/***
* @method 方法描述: 计算支付金额,通过渠道Id和商品id 调用各自的银行的报文进场封装
* @param changeId
* @param goodsId
* @return
*/
@Override
public BigDecimal calRecharge(Integer changeId, Integer goodsId) {
System.out.println("调用ICBC接口:calRecharge("+changeId+","+"goodsId)");
return new BigDecimal(1) ;
}
}
4添加注解类Pay
package com.fwf.pay;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Created by Administrator on 2018/5/27.
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME) //注解的生命周期
public @interface Pay {
int value();
}
5添加反射工厂StrategyFactory
package com.fwf.pay;
import com.sun.tools.internal.xjc.reader.xmlschema.bindinfo.BIConversion;
import org.reflections.Reflections;
import java.util.HashMap;
import java.util.Set;
/**
* Created by Administrator on 2018/5/27.
*/
public class StrategyFactory {
private static StrategyFactory factory=new StrategyFactory();
public StrategyFactory(){}
public Strategy creator(int type) throws Exception {
String clazz=source_map.get(type);
Class clazz_= Class.forName(clazz);
//通过newInstance反射生产对象
return (Strategy)clazz_.newInstance();
}
public static HashMap<Integer,String> source_map=new HashMap<>();
static {
//反射工具包,指明扫描路径
Reflections reflections = new Reflections("com.fwf.pay.impl");
//获取带注解的类pay的
Set<Class<?>> classList=reflections.getTypesAnnotatedWith(Pay.class);
//根据注解的值,把类名放在map中
for(Class clazz:classList){
Pay t= (Pay) clazz.getAnnotation(Pay.class);
source_map.put(t.value(),clazz.getCanonicalName());
}
}
public static StrategyFactory getInstance(){
return factory;
}
}
6添加上下文统一对外接口Context
package com.fwf.pay;
import java.math.BigDecimal;
/**
* Created by Administrator on 2018/5/27.
*/
public class Context {
private Strategy strategy;
public BigDecimal calRecharge(Integer channeId,Integer goodsId) throws Exception {
//根据工厂去帮我们创建具体的实现类接收实例的对象
strategy= StrategyFactory.getInstance().creator(channeId);
return strategy.calRecharge(channeId,goodsId);
}
}
7添加Spring 托管类InitNewService
博客参考来源
cgengwei博客 https://blog.csdn.net/cgengwei/article/details/79419305
kenick的博客 http://blog.csdn.net/leadseczgw01/article/details/53941871
飞飞狐的博客 http://blog.csdn.net/xiefeifeihu/article/details/5701436
package com.fwf.pay;
import com.sun.tools.internal.xjc.reader.xmlschema.bindinfo.BIConversion;
import org.reflections.Reflections;
import java.util.HashMap;
import java.util.Set;
/**
* Created by Administrator on 2018/5/27.
*/
public class StrategyFactory {
private static StrategyFactory factory=new StrategyFactory();
public StrategyFactory(){}
public Strategy creator(int type) throws Exception {
String clazz=source_map.get(type);
Class clazz_= Class.forName(clazz);
//通过newInstance反射生产对象
return (Strategy)clazz_.newInstance();
}
public static HashMap<Integer,String> source_map=new HashMap<>();
static {
//反射工具包,指明扫描路径
Reflections reflections = new Reflections("com.fwf.pay.impl");
//获取带注解的类pay的
Set<Class<?>> classList=reflections.getTypesAnnotatedWith(Pay.class);
//根据注解的值,把类名放在map中
for(Class clazz:classList){
Pay t= (Pay) clazz.getAnnotation(Pay.class);
source_map.put(t.value(),clazz.getCanonicalName());
}
}
public static StrategyFactory getInstance(){
return factory;
}
}
8添加StrUtils处理首字母大写
package com.fwf.pay;
/**
* Created by Administrator on 2018/5/27.
*/
public class StrUtils {
//首字母转小写
public static String toLowerCaseFirstOne(String s) {
if (Character.isLowerCase(s.charAt(0)))
return s;
else
return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString();
}
//首字母转大写
public static String toUpperCaseFirstOne(String s) {
if (Character.isUpperCase(s.charAt(0)))
return s;
else
return (new StringBuilder()).append(Character.toUpperCase(s.charAt(0))).append(s.substring(1)).toString();
}
}
9添加PayController用于测试
package com.fwf.controller;
import com.fwf.pay.Context;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
/**
* Created by Administrator on 2018/5/27.
*/
@RestController
public class PayController {
/**
* 测试反射机制
* @return
*/
@RequestMapping("tocalc")
public String calcAmount() throws Exception {
System.out.println("测试反射机制:" );
Context context=new Context();
BigDecimal bigDecimal =context.calRecharge(2,2);
return bigDecimal.setScale(2)+"";
}
}
10测试结果
2018-05-27 17:55:54 - ===============请求内容===============
测试反射机制:
调用CMB接口:calRecharge(2,goodsId)
2018-05-27 17:55:54 - --------------返回内容----------------
2018-05-27 17:55:54 - Response内容:"2.00"
2018-05-27 17:55:54 - --------------返回内容----------------
2018-05-27 17:55:54 - 请求处理时间为:14