springboot将代码配置化,通过不同的配置参数来调用不同的方法

springboot将代码配置化,通过不同的配置参数来调用不同的方法

刚接到一个需求,将之前写好的代码改成配置,通过修改配置文件,然后调用不同的方法,从而达到满足需求。

  1. 之前写好的代码 ,这是一个utils,我就拿出我需要的部分
/**
	 * * 获取两字符串的相似度数据      
	 */
	public JSONObject getSimilarityRatio(String str, String target) {
		JSONObject resultJ = new JSONObject();

		// 去除空白字符、换行、标点符号
		String regex = "[\\pP\\p{Punct}\\s]";
//		System.out.println("str= " + str.replaceAll(regex, ""));
//		System.out.println("target= " + target.replaceAll(regex, ""));
		resultJ.put("recLabel", str);
		resultJ.put("manualTxt", target);


		// 最小改变步骤
		int minStep = compare(str.replaceAll(regex, ""), target.replaceAll(regex, ""));
		resultJ.put("minStep", minStep);
//		System.out.println("最少改动步骤数:" + minStep + " 步");
//		System.out.println("insert_num= " + insert_num);
//		System.out.println("delete_num= " + delete_num);
//		System.out.println("substitute_num= " + substitute_num);
//		System.out.println("correct_num= " + correct_num);
//		System.out.println("target_num= " + target_num);

		resultJ.put("numI", insert_num);
		resultJ.put("numD", delete_num);
		resultJ.put("numS", substitute_num);
		resultJ.put("numH", correct_num);
		resultJ.put("numN", target_num);

		float corr, acc;
		if (correct_num == 0 || target_num == 0 || correct_num - insert_num < 0) {
			corr = 0;
			acc = 0;
		} else {
			corr = (float) ((int) (((float) correct_num / (float) target_num) * 10000)) / 100;
			acc = (float) ((int) (((float) (correct_num - insert_num) / (float) target_num) * 10000)) / 100;
		}

		resultJ.put("Acc", acc);
		resultJ.put("Corr", corr);
//		System.out.println("Acc= " + acc);
//		System.out.println("Corr= " + corr);

		return resultJ;
	}


	/**
	 * 单独计算准确率和正确率
	 * @param taskDataAccList
	 * @return
	 */
	public JSONObject calcuAccAndCorr(List<JSONObject> taskDataAccList){
		JSONObject jsonObject = new JSONObject();
		Integer sumI = 0;
		Integer sumH = 0;
		Integer sumN = 0;
		for (JSONObject taskDataAccJ : taskDataAccList) {
			sumI += taskDataAccJ.getInteger("numI");
			sumH += taskDataAccJ.getInteger("numH");
			sumN += taskDataAccJ.getInteger("numN");
		}

		//正确率
		float sumAcc = 0;
		//准确率
		float sumCorr = 0;
		if (sumN > 0) {
			sumCorr = (float) ((int) (((float) sumH / (float) sumN) * 10000)) / 100;
			sumAcc = (float) ((int) (((float) (sumH - sumI) / (float) sumN) * 10000)) / 100;
			sumAcc = (sumAcc < 0) ? 0 : sumAcc;
		}
		jsonObject.put("sumAcc", sumAcc);
		jsonObject.put("sumCorr", sumCorr);
		return  jsonObject;
	}

	/**
	 *
	 * @param resultString 语音识别文本
	 * @param standardScript 标准文本
	 * @return 偏移率
	 */
	public float getDeviationRate(String resultString, String standardScript) {
		//去掉标点符号,标点符号不做偏移率计算
		String strstandardScript = standardScript.replaceAll("[\\pP\\p{Punct}]", "");
		String strresultString = resultString.replaceAll("[\\pP\\p{Punct}]", "");
		logger.info("standardScript:" + strstandardScript);
		logger.info("resultString:  " + strresultString);
		int length= 0;
		char[] charstandardScripts = strstandardScript.toCharArray();
		char[] chartrresultStrings = strresultString.toCharArray();
		logger.info("标准文本长度:" + charstandardScripts.length);
		logger.info("识别文本长度:" + chartrresultStrings.length);
		if (charstandardScripts.length>chartrresultStrings.length) {
			length=chartrresultStrings.length;
		}else {
			length=charstandardScripts.length;
		}
		logger.info("使用文本长度:" + length);
		float state = 0;
		for (int i = 0; i < length; i++) {
			if (chartrresultStrings[i] == charstandardScripts[i]) {
				state++;
			}
		}
		logger.info("正确数:" + state);
		float rate = changeDeviationRate(state/charstandardScripts.length);
		//JSONObject rate = changeDeviationRate(state/charstandardScripts.length);

		return rate;
	}

	//flaot保留两位
	public float changeDeviationRate(float rate) {
		Float priceCar = rate;
		// 设置位数
		int scale = 2;
		// 表示四舍五入,可以选择其他舍值方式,例如去尾,等等.
		int roundingMode = 4;
		BigDecimal bd = new BigDecimal((float) priceCar);
		bd = bd.setScale(scale, roundingMode);
		priceCar = bd.floatValue();
		return priceCar;
	}

上面代码就是需要通过不同的配置,然后调用不同的方法

接下来就是要写一个配置


/**
 * TextCompConfig 偏移率和正确率配置路径
 */
@ConfigurationProperties(prefix = "textcomp.patch")
@Component
public class TextCompConfig {

    //textComp的配置
    private String textcomp;

    public TextCompConfig(String textcomp) {

        this.textcomp = textcomp;

    }

    public TextCompConfig() {

    }

    public String getTextcomp() {
        return textcomp;
    }

    public void setTextcomp(String textcomp) {
        this.textcomp = textcomp;
    }

    @Override
    public String toString() {
        return "TextCompConfig{" +
                "textcomp=" + textcomp +
                '}';
    }
}

这个类主要就是一个@ConfigurationProperties(prefix = "textcomp.patch")注解,可以在配置中进行配置
配置类写好之后,就是进行选择判断,假如在配置文件中配置的是1,那么就会调用1这个方法,如果配置文件中是2,那么就会调用2这个方法

/**
	 * 配置化
	 * @param resultString
	 * @param standardScript

	 * @return
	 */
	public JSONObject getTextComp(String resultString, String standardScript) {
		String textComp = textCompConfig.getTextcomp();
		JSONObject jsonObject = new JSONObject();

		if (textComp.equals("1")) {
			//计算正确率和准确率
			return this.getSimilarityRatio(resultString,standardScript);

		}
		if (textComp.equals("2")){
			//计算偏移率
			float deviationRate = this.getDeviationRate(resultString, standardScript);
			//将float转化为string格式
			String deviationRate1 = (String) jsonObject.put("deviationRate", deviationRate + "");
			//将string转为jsonObject
			return JSON.parseObject(deviationRate1);
		}
		return jsonObject;

	}

由于后面同事写的返回的是一个JSONObject类型,而getSimilarityRatio()方法的返回值是JSONObject,所有我这边统一返回一个JSONObject类,但是getDeviationRate()方法返回的是一个float类型,所以要将float类型转为JSONObject类,这里做了一个判断,如果配置是1,调用1这个方法,配置为2,就调用2这个方法
然后就是controller层的调用

 @ApiOperation(value = "文字准确率和正确率测试", notes = "文字准确率和正确率测试")
    @RequestMapping(value = "/accTest", method = RequestMethod.POST)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "iatTxt", value = "识别文本", dataType = "string", paramType = "query", example = "张三", required = false),
            @ApiImplicitParam(name = "targetTxt", value = "目标文本", dataType = "string", paramType = "query", example = "123456", required = false)})
    public ResponseVo accTest(@RequestBody CalcuTxtInfo calcuTxtInfo) {
        ResponseVo responseVo = new ResponseVo();

        // JSONObject  jsonObject = textCompUtils.getSimilarityRatio(calcuTxtInfo.getIatTxt(), calcuTxtInfo.getTargetTxt());
        JSONObject jsonObject = textCompUtils.getTextComp(calcuTxtInfo.getIatTxt(), calcuTxtInfo.getTargetTxt());


        if (textCompConfig.getTextcomp().equals("1")) {
            //计算正确率和准确率
            calcuTxtInfo.setSumCorr(new BigDecimal(Float.valueOf(jsonObject.get("Corr").toString()) / 100).setScale(3, BigDecimal.ROUND_HALF_UP).floatValue());
            calcuTxtInfo.setSumAcc(new BigDecimal(Float.valueOf(jsonObject.get("Acc").toString()) / 100).setScale(3, BigDecimal.ROUND_HALF_UP).floatValue());
            responseVo.setData(calcuTxtInfo);
            return responseVo;
        }
        if (textCompConfig.getTextcomp().equals("2")) {
            //计算偏移率
            float deviationRate = textCompUtils.getDeviationRate(calcuTxtInfo.getIatTxt(), calcuTxtInfo.getTargetTxt());
            responseVo.setData(deviationRate);
            return responseVo;
        }
       // float deviationRate = textCompUtils.getDeviationRate(calcuTxtInfo.getIatTxt(), calcuTxtInfo.getTargetTxt());

        return responseVo;

最后就是用的配置文件了,我这个用的是properties

# 偏离度
textcomp.patch.textcomp=1

这个需求我自己测试是可以的

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Spring Boot应用程序中调用本地接口和调用本地方法是类似的过程,因为它们都需要在应用程序内部进行方法调用。以下是两种不同的方式来实现这两种情况: 1. 调用本地接口 如果你的Spring Boot应用程序需要调用另一个运行在同一台计算机上的应用程序的本地接口,你可以使用Spring的RestTemplate类来完成这个任务。 RestTemplate类是Spring提供的HTTP客户端,它可以发送HTTP请求到指定的URL,并接收响应。以下是一个简单的示例代码,演示了如何使用RestTemplate调用本地接口: ```java RestTemplate restTemplate = new RestTemplate(); String result = restTemplate.getForObject("http://127.0.0.1:8080/local-api", String.class); ``` 这个代码片段创建了一个RestTemplate对象,并使用它发送一个GET请求到"http://127.0.0.1:8080/local-api" URL。接下来,它将响应的结果作为字符串返回。 2. 调用本地方法 如果你的Spring Boot应用程序需要调用另一个Java类的本地方法,你可以使用Spring的依赖注入功能来获这个类的实例,并直接调用它的方法。以下是一个简单的示例代码,演示了如何在Spring Boot应用程序中调用本地方法: ```java @Component public class MyService { public String localMethod() { return "Hello World"; } } @Service public class MyServiceCaller { @Autowired private MyService myService; public void callLocalMethod() { String result = myService.localMethod(); System.out.println(result); } } ``` 这个代码片段中,MyService类定义了一个名为localMethod的方法,它返回一个字符串。然后,MyServiceCaller类使用@Autowired注解来注入MyService类的实例,并在callLocalMethod方法调用它的localMethod方法。最后,这个方法将返回的字符串打印到控制台上。 需要注意的是,如果你想在Spring Boot应用程序中调用本地方法,被调用方法必须在一个Spring管理的Bean类中定义。 ### 回答2: Spring Boot调用本地接口和调用本地方法的方式是不同的。 调用本地接口: Spring Boot可以通过RestTemplate或者Feign来调用本地接口。首先需要在配置文件中配置服务的地址为127.0.0.1,然后创建RestTemplate或者Feign接口,并使用@FeignClient注解来指定调用的接口地址。然后就可以使用这个接口进行调用调用方式和调用远程接口类似。 调用本地方法: 如果是在同一个应用中调用本地方法,则可以直接使用方法调用的方式,在需要调用的地方直接调用即可。如果是不同的模块之间需要调用本地方法,则可以通过@Autowired注解注入需要调用方法所在的类,然后直接调用对应的方法即可。 总结: 无论是调用本地接口还是调用本地方法,Spring Boot都提供了相应的方式来实现。需要根据具体的需求来选择合适的方式进行调用。 ### 回答3: 在Spring Boot中,调用127.0.0.1的本地接口与调用本地方法有一些区别。 首先,调用本地接口涉及到网络通信。当我们使用Spring Boot调用127.0.0.1的本地接口时,实际上是通过网络协议进行通信的。这意味着我们需要使用网络通信相关的技术,比如使用HTTP或TCP协议来发送请求和接收响应。我们可以使用RestTemplate或者Feign等HTTP客户端库来简调用接口的过程。通过发送HTTP请求,我们可以与本地接口进行交互,发送请求参数并接收返回结果。 而调用本地方法则不需要网络通信。当我们调用本地方法时,实际上是直接在当前JVM进程中调用方法。这种方式避免了网络通信带来的延迟和资源开销,通常比远程调用更高效。在Spring Boot中,我们可以直接通过依赖注入或者直接调用方法调用本地方法。这种方式适用于不需要跨进程通信的场景,比如在同一个应用中的不同模块之间进行方法调用。 总结来说,通过Spring Boot调用127.0.0.1的本地接口和调用本地方法都可以实现与本地接口的交互,但是调用本地接口需要进行网络通信,而调用本地方法则是直接在当前JVM进程中进行方法调用。根据实际需求,我们可以灵活选择适合的方式来调用本地接口或者本地方法

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值