Spring 注解加反射机制,实现接口封装

该文章是通过在云析学院的老师讲解终结的。

场景描述:

        通过接口封装,以及反射机制,和注解的方式。实现接口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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值