天天看点

【测试平台开发笔记】后端开发——springboot基础

文章目录

    • 一、为什么使用springboot
    • 二、如何快速新建一个springboot项目
      • 2.1 https://start.spring.io/
      • 2.2 使用IDE的插件进行快速创建(Idea,Eclipse)
    • 三、标准spring项目结构如何理解
      • 3.1 约定大于配置
        • 3.1.1 约定结构长什么样
        • 3.1.2 项目流程(登录为例)
      • 3.2 restful风格的接口实现方式(常用注解)
        • 3.2.1 RequestParam、PathParam、PathVariable用法
      • 3.3 lombok注解
      • 3.4 其他常用注解
        • 3.4.1 @Resource和@Autowired注入bean的区别
      • 3.5 常用配置介绍
      • 3.6 springboot多环境配置
        • 3.6.1 在配置文件中指定
        • 3.6.2 打包时指定方法,在pom文件中指定。
        • 3.6.3 jar包简单运行脚本示例(linux)
    • 四、以jar包形式启动springboot项目
    • 五、swagger介绍
      • 5.1 定义
      • 5.2 maven依赖
      • 5.3 配置类
      • 5.4 配置项
      • 5.5 启动地址
      • 5.6 常用注解

一、为什么使用springboot

1. 有利于开发(整合框架,例如整合了springMVC,Mybatis等框架)
	2. 启动无需配置tomcat(java应用程序运行,实际以jar包运行,内置tomcat)
	3. 自动管理依赖
	4. 自带应用监控
           

二、如何快速新建一个springboot项目

2.1 https://start.spring.io/

2.2 使用IDE的插件进行快速创建(Idea,Eclipse)

步骤:New Project ——> Spring Initializr

Tips: idea没有Spring Initializr解决方法: plugins-Spring Assistant

maven:更改maven项目到本地非系统盘

三、标准spring项目结构如何理解

3.1 约定大于配置

【测试平台开发笔记】后端开发——springboot基础

3.1.1 约定结构长什么样

三层结构
controller:
	与客户端(前台)打交道的类放在*Controller包里
	负责分发前端请求,不做具体的业务处理
service:
	后端系统放在service下
	负责主要的业务处理	
	接口、实现类
dao:
	数据访问层
	与数据库交互	
	
实体类
dto:
	用于客户端和服务端交互时请求参数与响应参数的封装,以dto结尾的
entity:
	用于服务端和数据库交互时参数的封装,比如查询数据库时响应数据的封装
	
util:
	校验,如字符串是否为空,邮箱格式校验等
	
*Application:
	主类,必须在最外层的包里
           

3.1.2 项目流程(登录为例)

1. 用户发送请求,到Controller层
2. Controller接收到参数,用dto里的UserDto类接收参数
3. 调用service层,具体的一个接口*Service接口,实际调用了子类*ServiceImpl
	登录方法
4. 用户拿到密码,调用dao里的类
5. dao到数据库里查询相应的用户名密码是否存在
6. 将用户名,密码封装到跟数据库打交道的实体类entity中
7. 数据库跟entity交互,一行代码就确认用户名密码是否存在
8. 返回的结果通过dto层层传递给客户端
           

3.2 restful风格的接口实现方式(常用注解)

@SpringBootApplication:
	springboot主类,用来加载springboot各种特性
@RestController: 
	Spring会转换返回值并将其写入HTTP响应
@RequestMapping: 
	用于类和方法,在方法级别时,用于处理HTTP的各种方法
	类似于postman,对各种不同类型的请求进行配置
	参数:value ,method
	405 请求错误:get、post使用错误
@RequestBody: 
	将request body中的json/xml对象解析成该参数类型的Javabean对象
	bean:实体类,类似于包含get/set方法的最小单元
@PathVariable: 
	处理动态的URI,URI的值可以作为控制器中处理方法的参数
	eg: http://localhost:8080/goYiBaTest/byId/22eee21/222
@Post/Put/Get/DeleteMapping:
	在方法级别上使用,用于处理HTTP的各种方法
	@RequestMapping(value = "login",method = RequestMethod.POST) 等价于 @PostMapping("/login")
	@RequestMapping(value = "login",method = RequestMethod.GET) 等价于 @GetMapping("/login")
@PathParam:
	处理get请求的参数
	eg:http://localhost:8080/goYiBaTest/byId?userId=12344&idNum=2232
@RequestParam:
	处理get请求的参数
	设置是否必传,设置默认值
	获取参数
	
组合使用的例子:
	模板:http://localhost:8080/springmvc/hello/101?param1=10&param2=20
	
	@RequestMapping("/hello/{id}")
	public String getDetails(@PathVariable(value="id") String id,
	   @RequestParam(value="param1", required=true) String param1,
	   @RequestParam(value="param2", required=false) String param2){
	.......
	}
           

3.2.1 RequestParam、PathParam、PathVariable用法

@GetMapping("/data/reqparam/{id}")
// @RequestParam 可以设置参数是否为必须传,以及默认值
// URL:xxxx/shop/data/reqparam/1?id=2
public String dataTest(@RequestParam(value="id",defaultValue = "2",required = true) String id) {
    return id;
}
 
@GetMapping("/data/pathparam/{param}")
// 获取参数同@RequestParam
// URL:xxxx/shop/data/pathparam/1?param=2
public String dateTest3(@PathParam(value="param") String param) {
    return param;
}
 
@GetMapping("/data/pathvar/{name}")
// URL:xxxx/shop/data/pathvar/1
public String dateTest2(@PathVariable(value="name",required = true) String name) {
    return name;
}
           

3.3 lombok注解

功能: 引入lombok插件,使用注解的方式,替代冗余get\set方法
		`dto文件中,对属性进行私有化,引入get\set方法进行调用`
步骤:
	1. ide插件中查找Lombok插件并安装 
	2. dto文件类前加注解@Data
           

3.4 其他常用注解

Component:声明为springboot的bean
RestController:controller层的bean
Repository:用于dao层的bean
Service:用于service层的bean
Autowired:用于向一个bean中注入其他bean
Bean:声明其为bean实例,常和Configuration配合使用
Configuration:用于声明springboot的配置文件夹
Value("$(key)"):获取springboot配置文件中的值
           
@Value("${test.key1}")
private String testKey1;
           

3.4.1 @Resource和@Autowired注入bean的区别

参考:https://blog.csdn.net/magi1201/article/details/82590106
共同点
	@Resource和@Autowired都可以作为注入属性的修饰,在接口仅有单一实现类时,两个注解的修饰效果相同,可以互相替换,不影响使用。
不同点
	@Resource
		@Resource是Java自己的注解
		@Resource有两个属性是比较重要的,分是name和type;Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。
		如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
	@Autowired
		@Autowired是spring的注解,是spring2.5版本引入的
		@Autowired只根据type进行注入,不会去匹配name。如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier或@Primary注解一起来修饰。
		
一个接口有多个实现类
共同点:
	两者都可以使用@Qualifier来标注需要注入的类。

	@Resource(name="woman")指定对应的实现名称
		方法一:使用name属性指定
		 	@Resource(name="woman")
		方法二:@Qualifier
			注入类上添加注解@Resource
			注入类上添加注解@Qualifier("woman")
			
	@Autowired的就根据在实现类上添加@Primary注解来区分
		方法一:@Qualifier
			注入类上添加注解@Autowired
			注入类上添加注解@Qualifier("woman")
		方法二:@Primary
			注入类上添加注解@Autowired
			实现类上添加注解@Primary
		@Primary是修饰实现类的,告诉spring,如果有多个实现类时,优先注入被@Primary注解修饰的那个
           

3.5 常用配置介绍

配置文件位置在resources包下,有以下两种文件形式,一般使用yaml格式的文件,语法如下:

application.yaml或application.yml
	server:
		port:8093
		connection-timeout:18000000
		servlet:
			session:
				timeout:30m  # 30分钟,测试的话时间不能太短,否则不准。单位:h、m、s,不写单位默认毫秒。
	spring:
		application:
			name:aitest  # springboot 微服务单元名称,在spring cloud集群中用该名称来识别这个微服务单元
			
application.properties
		server.port=8093
           

3.6 springboot多环境配置

目的:实现开发、测试、用户等的环境隔离。

3.6.1 在配置文件中指定

【测试平台开发笔记】后端开发——springboot基础

3.6.2 打包时指定方法,在pom文件中指定。

<profiles>
	<!-- 开发环境 默认开发环境-->
	<profile>
		<id>dev</id>
		<properties>
			<spring.profile.active>dev</spring.profile.active>
		</properties>
		<activation>
			<activeByDefault>true</activeByDefault>
		</activation>
	</profile>
	<!-- 测试环境 -->
	<profile>
		<id>test</id>
		<properties>
			<spring.profile.active>test</spring.profile.active>
		</properties>
	</profile>
	<!-- 用户环境 -->
	<profile>
		<id>usr</id>
		<properties>
			<spring.profile.active>usr</spring.profile.active>
		</properties>
	</profile>
	<!-- 预生产环境 -->
	<profile>
		<id>uat</id>
		<properties>
			<spring.profile.active>uat</spring.profile.active>
		</properties>
	</profile>
</profiles>
           

3.6.3 jar包简单运行脚本示例(linux)

test_start_8081.sh

sh test_start_8081.sh  # 运行
ps -ef|grep aitest-mini # 查进程
tail -f test_info_8081.log # 实时查看日志
           

四、以jar包形式启动springboot项目

打包: mvn clean install -U -DskipTests
命令行启动:java -jar *.jar
           

五、swagger介绍

5.1 定义

Swagger:
	一个规范和完整的框架
	用于生成、描述、调用和可视化 RESTful 风格的 Web 服务框架
	 
	总体目标:使客户端和文件系统作为服务器以同样的速度来更新。
	文件的方法、参数和模型紧密集成到服务器端的代码,允许 API 始终保持同步。

Swagger UI:
	允许任何人(无论您是开发团队还是最终用户)可视化API资源并与之交互
	无需任何实现逻辑
	
	根据您的OpenAPI(以前称为swagger)规范自动生成,具有可视化文档
	简化后端实现和客户端使用,方便前后端联调

API(Application Programming Interface,应用程序接口):
	预先定义的接口(如函数、HTTP接口),或指软件系统不同组成部分衔接的约定。
           

5.2 maven依赖

<!-- swagger -->
<dependency>
   <groupId>io.springfox</groupId>
   <artifactId>springfox-swagger2</artifactId>
   <version>2.9.2</version>
</dependency>
<dependency>
   <groupId>io.springfox</groupId>
   <artifactId>springfox-swagger-ui</artifactId>
   <version>2.9.2</version>
</dependency>
<dependency>
   <groupId>io.springfox</groupId>
   <artifactId>springfox-bean-validators</artifactId>
   <version>2.9.2</version>
</dependency>
<dependency>
   <groupId>io.swagger</groupId>
   <artifactId>swagger-annotations</artifactId>
   <version>1.6.2</version>
</dependency>
<dependency>
   <groupId>io.swagger</groupId>
   <artifactId>swagger-models</artifactId>
   <version>1.5.22</version>
</dependency>
           

5.3 配置类

【测试平台开发笔记】后端开发——springboot基础
@Configuration
@EnableSwagger2
public class SwaggerConfig {
}
           

5.4 配置项

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket docket(){
        //header
        ParameterBuilder builder = new ParameterBuilder();
        builder.parameterType("header").name("token")
                .description("token值")
                .required(true)
                .modelRef(new ModelRef("string")); 	//在swagger里显示header
        //apiInfo

        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("goyiba_interface")
                .apiInfo(apiInfo())
                .globalOperationParameters(Lists.newArrayList(builder.build()))
                .select().paths(PathSelectors.any()).build();
    }
    public ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title("goyiba-mini系统")
                .description("goyiba-mini接口文档")
                .contact(new Contact("tlibn","","[email protected]")) //联系人
                .version("1.0")
                .build();
    }
}
           

5.5 启动地址

http://localhost:8080/swagger-ui.html/
           

5.6 常用注解

@Api(tags="gouyiba-测试任务管理")
	添加到Controller类
@ApiOperation(value="添加测试任务")
	添加到接口方法上
@ApiModel(value=“新增测试任务类”,description="请求参数类")
	实体类,请求参数
@ApiModelProperty(value="测试用例的id列表", example="12",required=true)
	方法