根据service名称查找实例并调用-项目实例

该博客介绍了如何在Spring框架中,通过服务名称动态查找并调用对应的服务实例。首先展示了Controller层的代码,通过HttpServletRequest获取请求参数,并调用paymentService.excute方法。然后在paymentService中,查找对应服务名称的实例,使用ApplicationUtil来获取Bean。此外,还展示了ApplicationUtil类的实现,它实现了ApplicationContextAware接口,以便于获取ApplicationContext中的所有bean。整个流程包括了服务实例查找、方法调用以及异常处理等关键步骤。

1.controller 部分的代码

    @RequestMapping("/service")
    @ResponseBody
    public Map<String, Object> service(HttpServletRequest request,HttpServletResponse response){
        
        String ip = request.getRemoteAddr();
        boolean flag = false;
        flag = ipConfig.judge(ip,request.getParameter("userDevice")); // 限制接口访问者的IP 代码
        if(!flag){
            return null;
        }
        //获取request值
        Map<String,Object> param = CgtUtil.getParameterMapObject(request);
        //running 表中type值
        param.put("payServiceType", 2);
        Map<String, Object> map = paymentService.excute(param);
        //返回存管通返回的字符串
        return map;
    }
    限制接口访问者的IP 代码
    public boolean judge(String ip ,String userDevice){
        boolean res = false;
        if(null==ip || "".equals(ip))return false;
        if(null==userDevice || "".equals(userDevice))return false;
        IpconfigEntity par = new IpconfigEntity();
        par.setIp(ip);
        par.setSource(userDevice);
        List<IpconfigEntity> resList = ipConfigDao.queryEntityByPar(par); 可用iP存在数据库中
        if(resList.size()>0)res=true;
        return res;
    }


-------根据service名称查找对应的实例----------

    public Map<String, Object> excute(Map<String, Object> par) {
        log.info("protocol init...");
        checkService = payConfig.getCheckConfig(); //加载检查类
        boolean flag = checkConfig(par); //检查参数是否正确
//        log.info("judge parameter is null.");
        if(!flag)return returnError(ServerException.PARAMETES_EXCEPTION);
        String serviceName = this.findServiceName(par.get("code").toString());
//        String serviceName = CodeRemoteServiceMappingEnum.getServiceName(par.get("code").toString());
        Object obj= payService.findService(serviceName);//查找对应service名称的实例  对应下边的代码↓
        flag = checkMethod(par, obj.getClass());
        if(!flag)return returnError(ServerException.VERSION_EXCEPTION);
        log.info("parameter access.");
        Method m =payService.findMehod(par.get("version").toString(),obj.getClass());
        //检查接口类型是否匹配
        if(par.get("version").toString().startsWith("v")){
            Integer serviceType = Integer.valueOf(par.get("payServiceType").toString());
            if(!this.judgeServiceType(par.get("code").toString(), serviceType)){
                if(serviceType==1)return returnError(ServerException.GATEWAY_TYPE_EXCEPTION);
                if(serviceType==2)return returnError(ServerException.SERVICE_TYPE_EXCEPTION);
            }
        }
        log.info("start protocol.");
        try{
            boolean resFlag=writeRunningService.writeRunning(par);
            if(!resFlag){
                throw new Exception("插入日志失败.");
            }
        }catch(Exception e){
            writeRunningService.insertException(par.get("code").toString(), e.getMessage());
            log.error("log write Exception."+e.getMessage());
        }
        try{
            Object resObj= m.invoke(obj, par);
            if(resObj != null){
                par.put("data", resObj);
                //判断直连返回值
                this.judgeDataStatus(par);
            }
            
        }catch(Exception e){
            e.printStackTrace();
            if(e.getCause() instanceof PaymentException){
                PaymentException pe = (PaymentException)e.getCause();
                return returnError(ServerException.getExceptionByIndex(pe.getIndex()));
            }
            return returnError(ServerException.SERVICE_EXCEPTION);
        }
        log.info("end protocol.");
        if(par.get("status") == null){
            par.put("status", ServerException.getCodeByIndex(0));
            par.put("msg", ServerException.EXCUTE_SUCCESS.getMsg());
        }
        return par;
    }


对应上边的代码↑

@Service
public class PayServiceImp implements PayService {
    @Autowired
    private ApplicationUtil applicationUtil;

    @Override
    public <T> T findService(String s) {
        return applicationUtil.getBean(s);
    }

    @Override
    public Method findMehod(String m,Class<?> cls) {
        Method method = null;
        try {
            method = cls.getMethod(m,Map.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return method;
    }

}


---

当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean。换句话说,就是这个类可以直接获取spring配置文件中,所有有引用到的bean对象。

@Component
public class ApplicationUtil implements ApplicationContextAware {
    
    private static ApplicationContext app ;
    
    public static <T> T getBean(Class<?> cls){
        return (T)app.getBean(cls);
    }
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        // TODO Auto-generated method stub
        app = applicationContext;
    }
    
    @SuppressWarnings("unchecked")
    public <T> T getBean(String bean){
        return (T) app.getBean(bean);
    }

}















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值