目录
我的上一篇博客:
初学SpringCloud:使用Eureka作为服务注册中心,写服务注册中心的微服务模块
1、背景介绍
我目前正在练习一个简单的微服务架构的项目。需要使用到实体类,这些实体类在很多的微服务模块中都会用到。为了减少代码的冗余,我现在要把这个几乎所有微服务模块都有的实体类抽取出来,组成一个子项目(微服务模块),然后通过Maven的install命令以后,可以在其他的微服务模块中的POM文件中,使用<dependency></depenency>标签,依赖进来。
2、我的包含公用实体类的微服务模块的POM文件解析
下面是我的POM文件中包含的依赖:
<?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">
<parent>
<artifactId>cloud2023</artifactId>
<groupId>com.lanse.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>cloud-api-commons</artifactId>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<optional>true</optional>
</dependency>
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<!--这个胡图工具包比较有用-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</dependency>
</dependencies>
<build>
<!--fialName:打成war包后的名字 ${project.artifactId}:为pom.xml中对应的名字 这个项目为miao_sha4 -->
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>utf8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</project>
以上就是我们的POM文件中包含有的依赖。
首先是我们父项目的g a v,这是我们在IDEA窗口化创建微服务项目的时候,自己填写完以后,软件帮我们生成的。
接下来是packaging标签,里面填的是jar,指的是内部调用或者是作服务使用。这里我们就是用jar就可以啦。它的值,默认是jar,一般情况下,父项目的packaging都是pom。还可以填 war。它们的区别,我也还不是很清楚,就不做过多的讲解了,以免误导了大家。(不知道你们注意了没有,我们项目中External Libaraies下面,就算文件夹很多,但我们最后都落脚到了.jar文件下,在我们初学的时候,我们还都是会在eclipse中的lib下面,把需要的jar包粘贴进去,这是最根本的)
再往下就是我们的<dependencies></dependencies>
前两个是我们的热部署的依赖和LomBok插件的依赖。LomBok这个插件的版本,一定要选的合适,甚至我有同事遇到过,使用它的@Data方法以后,属性的getter和setter并没有帮我们创建出来。
再往下的依赖是胡图工具包的一个依赖。它是一个JAVA工具包,据说是功能很强大,我现在还没有怎么使用过,在这里就心血来潮的加上了。有兴趣各位可以到别处仔细了解一下。
再往下,是maven-compiler-pugin的依赖。这个依赖说是跟jdk的版本有关系。好像是我们需要使用到胡图工具包,因此需要使用这个依赖。具体的我也是看了一些博客才有点明白了,但还是明白的不是很透彻。具体可以看下面的这片博客:
https://www.cnblogs.com/juncaoit/p/9426792.html
再向下就是plugins标签,规定了maven-compiler-pugin的jdk的版本。
最后一个插件是 maven-surefire-plugin。这个插件是跟测试有关的。如果不加的话,它自己是有默认的配置的。我们有这样的一句配置:<skipTests>true</skipTests>,我们跳过了测试的步骤,这样在启动编译的时候,程序能够加载的快一点。具体的关于这个插件可以参考下面的这一片连接
https://www.cnblogs.com/qyf404/p/5013694.html
其实我对POM文件的解析非常的浅显,我们人理解的也还不是非常的到位。
3、我的目录结构
以上是我的完成这个模块以后的目录结构。由于这个模块本来就是一个简单的公用实体类的模块,所有也不需要写application文件,也不需要main方法,因为它本身就不需要单独去跑。
在这里可以看到,当我们使用Maven的install命令以后,在target目录下方,就会出现一个jar包,我们以后的其它的服务模块中,就是直接引用的这个jar包
4、我的CommonResult实体类
一下是我的CommonResult实体类的代码:
package com.springcloud.entities;
public class CommonResult <T>{
private Integer code;
private String message;
private T data;
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
public T getData() {
return data;
}
public CommonResult(Integer code,String message,T data){
this.code=code;
this.message=message;
this.data=data;
}
public CommonResult(){}//这个是无参构造
public CommonResult(Integer code,String message){
//下面这个就直接是调用构造方法了
this(code,message,null);
//就不要像下面这样去使用了
// this.code=code;
// this.message=message;
}
public CommonResult<T> setCode(Integer code) {
this.code = code;
return this;
}
public CommonResult<T> setMessage(String message) {
this.message = message;
return this;
}
public CommonResult<T> setData(T data) {
this.data = data;
return this;
}
}
我想先说一下这个类创建的目的:
现在的商业开发,都是前后端分离的形式,我们传给前端的就只是一个JSON串。无论查询或插入返回的结果是什么,我们都使用一个CommonResult对象把结果进行一下封装。这个类带有一个泛型,这个泛型就是我代码中的 data属性。当我们把这个CommonResult对象返回的时候,因为我们有 @RestController注解,程序会在后台把我们返回的CommonResult对象转变为一个JSON串,这样前后端交互就只是JSON串的形式,实现了前后端的分离。
这个类中的代码,就是三个属性。泛型data,信息描述message,状态码code。再有就是get和set方法。最后,为了我们后期创建CommonResult对象的方便,我们写了三个构造方法。
其实可以把我们的CommonResult类跟ArrayList类做一个对比,二者有相似之处,都是支持泛型的。ArrayList可以存储很多种对象额数组,我们的CommonResult中,也可以包含很多种对象来作为返回结果。
5、我的Payment类
Payment类,是真真正正的跟数据库中的一张表对应的一个类,下面是它的代码:
package com.springcloud.entities;
import java.io.Serializable;
public class Payment implements Serializable {
private Long id;
private String serial;
public Long getId() {
return id;
}
public Payment setId(Long id) {
this.id = id;
return this;
}
public String getSerial() {
return serial;
}
public Payment setSerial(String serial) {
this.serial = serial;
return this;
}
}
这个类中只有两个属性,并且我在创建数据库的时候,是把id这个属性设为自动增长了。
由于我全部的微服务的后端代码用的都是MyBatis的框架,因此这里我没有使用@TableName和@TableId注解,我们都使用的是每个微服务中的xml文件来对dao层接口的方法写对应的SQL语句,并且在这个xml文件中,我们有设置数据库的表和实体类之间的对应关系。
多说一句:由于MyBatis框架还是比较高级的,因此它会有一些默认的实体类和数据库表的对应设置,默认的就是按照顺序和属性名,字段名相同的原则。因此,在我们创建数据库表和实体类的时候,尽量保证数据表的字段名和实体类的属性名相同。
为什么要集成Serializable接口?:我查了很多篇的博客,可能是我本人的基础知识很薄弱,我对这些博客所讲解的内容都不是很理解。我目前所理解的就是,一个实体类如果继承了Serializable接口,那么它就可以更加方便的在硬盘和我们的程序之间进行存取操作,对我们的商业开发中的远程的调用也是很方便的。
6、我们写好了代码以后的操作
现在我们已经写好了我们代码
只需要先点击图中的clean命令,然后点击install命令
当看到控制台全部都是INFO后,并且在target文件夹下有生成的jar包以后,那么我们就成功啦。
我的下一篇博客:
初学SpringCloud:将我的后端的业务逻辑模块注册到Eureka服务注册中心(描述后端业务逻辑模块的application和POM文件)