logo设置#
关闭logo图标#
配置方式#
1
|
spring.main.banner-mode=off
|
代码方式#
第一种代码:
1
2
3
4
5
6
7
8
|
@SpringBootApplication
public class Springboot322WebServerApplication {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(Springboot322WebServerApplication.class);
springApplication.setBannerMode(Banner.Mode.OFF);
springApplication.run(args);
}
}
|
第二种代码:流式编程/链式编程
1
2
3
4
|
new SpringApplicationBuilder()
.sources(Springboot322WebServerApplication.class)
.bannerMode(Banner.Mode.OFF)
.run(args);
|
修改logo图标#
在src/main/resources
目录下存放一个banner.txt
文件。文件名固定。
利用一些网站生成图标:
https://www.bootschool.net/ascii (支持中文、英文)
http://patorjk.com/software/taag/ (只支持英文)
https://www.degraeve.com/img2txt.php (只支持图片)
获取图标粘贴到banner.txt
文件中运行程序即可。
PageHelper整合#
官网地址:https://pagehelper.github.io/
引入依赖#
1
2
3
4
5
|
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
|
编写代码#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@RestController
public class VipController {
@Autowired
private VipService vipService;
@GetMapping("/list/{pageNo}")
public PageInfo<Vip> list(@PathVariable("pageNo") Integer pageNo) {
// 1.设置当前页码和每页显示的记录条数
PageHelper.startPage(pageNo, Constant.PAGE_SIZE);
// 2.获取数据(PageHelper会自动给SQL语句添加limit)
List<Vip> vips = vipService.findAll();
// 3.将分页数据封装到PageInfo
PageInfo<Vip> vipPageInfo = new PageInfo<>(vips);
return vipPageInfo;
}
}
|
web层响应结果封装#
对于前后端分离的系统来说,为了降低沟通成本,我们有必要给前端系统开发人员返回统一格式的JSON数据。多数开发团队一般都会封装一个R
对象来解决统一响应格式的问题。
封装R对象#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class R<T> {
private int code; // 响应的状态码
private String msg; // 响应的消息
private T data; // 响应的数据体
// 用于构建成功的响应,不携带数据
public static <T> R<T> OK() {
return R.<T>builder()
.code(200)
.msg("成功")
.build();
}
// 用于构建成功的响应,携带数据
public static <T> R<T> OK(T data) {
return R.<T>builder()
.code(200)
.msg("成功")
.data(data)
.build();
}
// 用于构建成功的响应,自定义消息,不携带数据
public static <T> R<T> OK(String msg) {
return R.<T>builder()
.code(200)
.msg(msg)
.build();
}
// 用于构建成功的响应,自定义消息,携带数据
public static <T> R<T> OK(String msg, T data) {
return R.<T>builder()
.code(200)
.msg(msg)
.data(data)
.build();
}
// 用于构建失败的响应,不带任何参数,默认状态码为400,消息为"失败"
public static <T> R<T> FAIL() {
return R.<T>builder()
.code(400)
.msg("失败")
.build();
}
// 用于构建失败的响应,自定义状态码和消息
public static <T> R<T> FAIL(int code, String msg) {
return R.<T>builder()
.code(code)
.msg(msg)
.build();
}
}
|
改进R对象#
以上R
对象存在的问题是,难以维护,项目中可能会出现很多这样的代码:R.FAIL(400, “修改失败”)。
引入枚举类型进行改进:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
@NoArgsConstructor
@AllArgsConstructor
public enum CodeEnum {
OK(200, "成功"),
FAIL(400, "失败"),
BAD_REQUEST(400, "请求错误"),
NOT_FOUND(404, "未找到资源"),
INTERNAL_ERROR(500, "内部服务器错误"),
MODIFICATION_FAILED(400, "修改失败"),
DELETION_FAILED(400, "删除失败"),
CREATION_FAILED(400, "创建失败");
@Getter
@Setter
private int code;
@Getter
@Setter
private String msg;
}
|
改进R:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class R<T> {
private int code; // 响应的状态码
private String msg; // 响应的消息
private T data; // 响应的数据体
// 用于构建成功的响应,不携带数据
public static <T> R<T> OK() {
return R.<T>builder()
.code(CodeEnum.OK.getCode())
.msg(CodeEnum.OK.getMsg())
.build();
}
// 用于构建成功的响应,携带数据
public static <T> R<T> OK(T data) {
return R.<T>builder()
.code(CodeEnum.OK.getCode())
.msg(CodeEnum.OK.getMsg())
.data(data)
.build();
}
// 用于构建失败的响应,不带任何参数,默认状态码为400,消息为"失败"
public static <T> R<T> FAIL() {
return R.<T>builder()
.code(CodeEnum.FAIL.getCode())
.msg(CodeEnum.FAIL.getMsg())
.build();
}
// 用于构建失败的响应,自定义状态码和消息
public static <T> R<T> FAIL(CodeEnum codeEnum) {
return R.<T>builder()
.code(codeEnum.getCode())
.msg(codeEnum.getMsg())
.build();
}
}
|
事务管理#
SpringBoot中的事务管理仍然使用的Spring框架中的事务管理机制,在代码实现上更为简单了。不需要手动配置事务管理器,SpringBoot自动配置完成了。我们只需要使用@Transactional
注解标注需要控制事务的方法即可。另外事务的特性等仍然延用Spring框架。大家可以在老杜发布的Spring视频教程中详细学习事务管理机制。以下代码是在SpringBoot框架中进行的事务控制:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountMapper accountMapper;
@Override
public void transfer(String fromActNo, String toActNo, double money) {
Account fromAct = accountMapper.selectByActNo(fromActNo);
if(fromAct.getBalance() < money){
throw new TransferException("余额不足");
}
Account toAct = accountMapper.selectByActNo(toActNo);
fromAct.setBalance(fromAct.getBalance() - money);
toAct.setBalance(toAct.getBalance() + money);
int count = accountMapper.update(fromAct);
if(1 == 1){
throw new TransferException("转账失败");
}
count += accountMapper.update(toAct);
if(count != 2){
throw new TransferException("转账失败!");
}
}
}
|
我们只需要在需要控制事务的方法上,或者类上,使用@Transactional
注解进行标注即可。然后事务的特性和之前Spring中是完全相同的。最重要的是其他的配置我们一律是不需要的。
SpringBoot打war包#
第一步:将打包方式设置为war
1
|
<packaging>war</packaging>
|
第二步:排除内嵌tomcat
1
2
3
4
5
6
7
8
9
10
11
|
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--内嵌的tomcat服务器排除掉-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
|
第三步:添加servlet api依赖(引入tomcat,但scope设置为provided,这样这个tomcat服务器就不会打入war包了)
1
2
3
4
5
6
|
<!--额外添加一个tomcat服务器,实际上是为了添加servlet api。scope设置为provided表示这个不会被打入war包当中。-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
|
第四步:修改主类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@MapperScan(basePackages = "com.powernode.transaction.repository")
@SpringBootApplication
public class Springboot324TransactionApplication extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Springboot324TransactionApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(Springboot324TransactionApplication.class, args);
}
}
|
第五步:执行package命令打war包
第六步:配置tomcat环境,将war包放入到webapps目录下,启动tomcat服务器,并访问。