环境:

项目结构:

关键配置

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.xlc</groupId>
<artifactId>demohmm</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>demohmm</name>
<description>Demo project for Spring Boot</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

application.yml

spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///parameter?useSSL=false
username: root
password: 123456
jpa:
hibernate:
ddl-auto: update
show-sql: true

Table1.java

package com.xlc.hmm;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id; import org.hibernate.annotations.Proxy; @Entity
@Proxy(lazy = false)
public class Table1 { @Id
@Column(name="id")
private int id;
@Column(name="wordlist")
private String wordList;
@Column(name="labellist")
private String labelList;
@Column(name="wordsize")
private int wordSize;
@Column(name="labelsize")
private int labelSize;
@Column(name="pi")
private String pi; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getWordList() {
return wordList;
}
public void setWordList(String wordList) {
this.wordList = wordList;
}
public String getLabelList() {
return labelList;
}
public void setLabelList(String labelList) {
this.labelList = labelList;
}
public int getWordSize() {
return wordSize;
}
public void setWordSize(int wordSize) {
this.wordSize = wordSize;
}
public int getLabelSize() {
return labelSize;
}
public void setLabelSize(int labelSize) {
this.labelSize = labelSize;
}
public String getPi() {
return pi;
}
public void setPi(String pi) {
this.pi = pi;
}
@Override
public String toString() {
return "Table1 [id=" + id + ", wordList=" + wordList + ", labelList=" + labelList + ", wordSize=" + wordSize
+ ", labelSize=" + labelSize + ", pi=" + pi + "]";
} }

Table2、Table3同理基于数据库映射关系构建

Table1Respository.java

package com.xlc.hmm;

import org.springframework.data.jpa.repository.JpaRepository;
//此处可以指定其他类型,因需而定
public interface Table1Respository extends JpaRepository<Table1, Integer>{}

Table2Respository.java、Table2Respository.java同理

HmmController.java

package com.xlc.hmm;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; //@Component
//@Order(value=1)
//class StartUpRunner implements CommandLineRunner {
// @Override
// public void run(String... args) throws Exception {
//// new ParamFromSql();
// System.out.println("SUCCESS");
// }
//} @Component
class ParamFromSql { @Autowired
private Table1Respository table1Respository; @Autowired
private Table2Respository table2Respository; @Autowired
private Table3Respository table3Respository; public static ParamFromSql paramFromSql; static List<String> wordlist;
static List<String> labellist;
static double[] pi;
static double[][] A;
static double[][] B; @PostConstruct
public void init() { paramFromSql = this;
paramFromSql.table1Respository = this.table1Respository;
paramFromSql.table2Respository = this.table2Respository;
paramFromSql.table3Respository = this.table3Respository; wordlist = new ArrayList<String>();
labellist = new ArrayList<String>();
// getParamFromMysql();
// Table1 table1 = paramFromSql.table1Respository.getOne(1);
// paramFromSql.table1Respository.getOne(1);
// System.out.println(paramFromSql.table1Respository.getOne(1));
Table1 table1 = paramFromSql.table1Respository.getOne(1);
System.out.println(table1.getLabelList());
labellist = Arrays.asList(table1.getLabelList().split(" "));
wordlist = Arrays.asList(table1.getWordList().split(" "));
String[] piStr = table1.getPi().split(" ");
int labelSize= table1.getLabelSize();
int wordSize = table1.getWordSize();
pi = new double[labelSize];
A = new double[labelSize][labelSize];
B = new double[labelSize][wordSize]; int j = 1;
for (int i = 0; i < labelSize; ++i) {
pi[i] = Double.valueOf(piStr[i]); String[] rowAStrs = paramFromSql.table2Respository.getOne(j).getRowA().split(" ");
for(int k = 0; k < labelSize; ++k) {
A[i][k] = Double.valueOf(rowAStrs[k]);
} String[] rowBStrs = paramFromSql.table3Respository.getOne(j).getRowB().split(" ");
for(int k = 0; k < wordSize; ++k) {
B[i][k] = Double.valueOf(rowBStrs[k]);
} ++j; } System.out.println("SUCCESS");
} } class Test{
public void test() {
System.out.println("-------------------------");
System.out.println(ParamFromSql.A[0][0]);
System.out.println(ParamFromSql.B[0][0]);
System.out.println("-------------------------");
}
} class SetLabel{ public String setLabel(String strInput) {
String result = "";
try {
int[] labelindex = viterbi(strInput, ParamFromSql.pi, ParamFromSql.A, ParamFromSql.B);
String[] strwords = strInput.split(" ");
for (int i = 0; i < labelindex.length; i++) {
result += strwords[i] + "/" + ParamFromSql.labellist.get(labelindex[i]) + " "; }
}catch(Exception e) {
e.printStackTrace();
}
return result;
} // viterbi
public int[] viterbi(String string, double[] pi, double[][] A, double[][] B) throws IOException{ String[] words = string.split(" ");
double[][] delta = new double[words.length][pi.length];
int[][] way = new int[words.length][pi.length];
int[] labelindex = new int[words.length];
//System.out.println(words[0]);
for (int i = 0; i < pi.length; i++) {
delta[0][i] = pi[i] * B[i][ParamFromSql.wordlist.indexOf(words[0])]; //////////////////////////////////////////////
}
for (int t = 1; t < words.length; t++) {
//System.out.println(words[t]);
for (int i = 0; i < pi.length; i++) {
for (int j = 0; j < pi.length; j++) {
////////
//System.out.println("t:" +t + "i:" + i + "j:" + j + "wordlist.indexOf(words[t]):"
// + wordlist.indexOf(words[t]));
if(delta[t][i] < delta[t-1][j] * A[j][i] * B[i][ParamFromSql.wordlist.indexOf(words[t])]) {
delta[t][i] = delta[t-1][j] * A[j][i] * B[i][ParamFromSql.wordlist.indexOf(words[t])];
way[t][i] = j;
}
}
}
}
double max = delta[words.length - 1][0];
labelindex[words.length - 1] = 0;
for (int i = 0; i < pi.length; i++) {
if (delta[words.length - 1][i] > max) {
max = delta[words.length - 1][i];
labelindex[words.length - 1] = i;
}
}
for (int t = words.length - 2; t >= 0; t--) {
labelindex[t] = way[t + 1][labelindex[t + 1]];
}
//System.out.println(Arrays.toString(labelindex));
return labelindex;
} } @RestController
public class HmmController { public String justDoIt(String str) {
String resultStr = null;
try {
resultStr = new SetLabel().setLabel(str);
}catch(Exception e) {
e.printStackTrace();
} return resultStr;
} @PostMapping("/hmm")
public String hmmDemo(@RequestParam(value = "str", required = false, defaultValue = "0") String testStr) {// return testStr;
if(testStr.equals("0")) {
return "are you kidding me?";
}else {
return justDoIt(testStr);
} } @GetMapping("/test")
public String test() {
// new Test().test();
return "do you like me?";
} }

DemohmmApplication.java

package com.xlc;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class DemohmmApplication { public static void main(String... args) { SpringApplication.run(DemohmmApplication.class, args);
}
}

现在右键DemohmmApplication运行,启动项目

看见这个是不是很激动

  .   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.0.6.RELEASE)

现在来使用Postman测试一下

  • 简单Get请求

  • 微服务测试(通过Post请求传入参数)

其实整个项目结构还是很清晰的

对于很多注解的使用,就需要好好的看书或着通过其他途径来学习一下了

这里再详细说明一下遇到的一个问题:在启动服务的时候将必要的模型参数读入内存以便在服务使用时可以很快的给出结果,而不是每请求一次就去数据库中读取一次参数,这样是耗时且不明智的

于是就使用到了@Component,被注解的类在项目启动时会进行加载,在这个类中可以定义

@Autowired
private Table1Respository table1Respository;

而不会在后续读库时报空指针异常

具体的用法就是

@Component
class ParamFromSql { @Autowired
private Table1Respository table1Respository; public static ParamFromSql paramFromSql; @PostConstruct
public void init() { paramFromSql = this;
paramFromSql.table1Respository = this.table1Respository;
}
}

想要获取操作数据库就使用 paramFromSql.table1Respository.具体的方法

还有一个重要的问题就是Hibernate默认的Lazy模式导致的no session异常

此时一个简单粗暴的解决办法就是在实体类上加注解指明不适用Lazy

@Entity
@Proxy(lazy = false)
public class Table1 {}

Github:https://github.com/xinglicha0/SpringBoot-Hmm

基于Spring Boot的微服务搭建的更多相关文章

  1. 一文读懂 Spring Boot、微服务架构和大数据治理三者之间的故事

    微服务架构 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物.互联网时代的产品通常有两类特点:需求变化快和用户群体庞大,在这种情况 ...

  2. 基于Spring Cloud的微服务入门教程

    (本教程的原地址发布在本人的简书上:http://www.jianshu.com/p/947d57d042e7,若各位看官有什么问题或不同看法请在这里或简书留言,谢谢!) 本人也是前段时间才开始接触S ...

  3. 干货|基于 Spring Cloud 的微服务落地

    转自 微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务.但如果要将微服务架构运用到生产项目上,并且能够发挥该架构模式的重要作用,则需要微服务框架的支持. 在Java生态圈,目前使用较多的 ...

  4. 基于Spring Cloud的微服务落地

    微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务.但如果要将微服务架构运用到生产项目上,并且能够发挥该架构模式的重要作用,则需要微服务框架的支持. 在Java生态圈,目前使用较多的微服务 ...

  5. 一文读懂spring boot 和微服务的关系

    欢迎访问网易云社区,了解更多网易技术产品运营经验. Spring Boot 和微服务没关系, Java 微服务治理框架普遍用的是 Spring Cloud. Spring Boot 产生的背景,是开发 ...

  6. Spring Boot、微服务架构和大数据

    一文读懂 Spring Boot.微服务架构和大数据治理三者之间的故事 https://www.cnblogs.com/ityouknow/p/9034377.html 微服务架构 微服务的诞生并非偶 ...

  7. spring boot 与微服务之间的关系

    Spring Boot 和微服务没关系, Java 微服务治理框架普遍用的是 Spring Cloud. Spring Boot 产生的背景,是开发人员对 Spring 框架越来越复杂的配置吐槽越来越 ...

  8. 基于 Spring Cloud 的微服务架构实践指南(下)

    show me the code and talk to me,做的出来更要说的明白 本文源码,请点击learnSpringCloud 我是布尔bl,你的支持是我分享的动力! 一.引入 上回 基于 S ...

  9. 基于 Spring Cloud 的微服务架构实践指南(上)

    show me the code and talk to me,做的出来更要说的明白 GitHub 项目learnSpringCloud同步收录 我是布尔bl,你的支持是我分享的动力! 一. 引入 上 ...

随机推荐

  1. Rancher

    Rancher Docker容器管理平台:图像化管理平台. centos server 10.100.10.10 docker node 10.100.10.15 安装 docker  search ...

  2. 第16月第27天 pip install virtualenv ipython sip brew search

    1. pip install virtualenv virtualenv testvir cd testvir cd Scripts activate pip https://zhuanlan.zhi ...

  3. 如何在同一台服务器上部署两个tomcat

    因为测试的需要,有时我们必须在同一个服务器上部署两个tomcat,然后去做应用的部署,那么很多同学可能会觉得比较为难,找的资料也比较的不齐全,那么今天华华就来给大家讲讲如何部署2个tomcat,并能够 ...

  4. webstorm11.0.3连接ftp

    一.工具 webstorm11.0.3 ftp工具:Beyond Compare 3 二.步骤 1.打开项目工程,按照下图中路径,打开ftp配置界面 2.在ftp配置界面 (1)右上角+号新建配置,选 ...

  5. es集群数据库~基本安装

    1 安装java环境   yum -y install java-1.8.0-openjdk*->需要最新的JDK环境1.82 安装 es   curl -L -O https://artifa ...

  6. Java对象与JSON互相转换jsonlib以及手动创建JSON对象与数组——(二)

    首先声明一下,jsonlib转换与GSON相比太差劲了,操作不是一般的繁琐.GSON可以直接转换成各种集合与对象类型.强烈推荐使用GSON.而且GSON一个方法就可以解决,jsonlib转来转去太繁琐 ...

  7. CSS如何进行图文并茂布局怎么破

    上下结构 左右结构 右边左边的结构

  8. C++学习3--编程基础(vector、string、三种传参)

    知识点学习 Vector容器 vector是C++标准程序库中的一个类,其定义于头文件中,与其他STL组件一样,ventor属于STD名称空间: ventor是C++标准程序库里最基本的容器,设计之初 ...

  9. 从Linux内核中获取真随机数【转】

    转自:http://www.cnblogs.com/bigship/archive/2010/04/04/1704228.html 内核随机数产生器 Linux内核实现了一个随机数产生器,从理论上说这 ...

  10. 【转】OpenCV对图片中的RotatedRect进行填充

    函数名:full_rotated_rect 函数参数: image输入图像,rect希望在图像中填充的RotatedRect,color填充的颜色 主要的思路是:先找到RotatedRect的四个顶点 ...