logo设置
关闭logo图标
配置方式
properties
spring.main.banner-mode=off
代码方式
第一种代码:
java
@SpringBootApplication
public class Springboot322WebServerApplication {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(Springboot322WebServerApplication.class);
springApplication.setBannerMode(Banner.Mode.OFF);
springApplication.run(args);
}
}
第二种代码:流式编程/链式编程
java
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/
引入依赖
xml
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
编写代码
java
@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对象
java
@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, "修改失败")。
引入枚举类型进行改进:
java
@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:
java
@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框架中进行的事务控制:
java
@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
xml
<packaging>war</packaging>
第二步:排除内嵌tomcat
xml
<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包了)
xml
<!--额外添加一个tomcat服务器,实际上是为了添加servlet api。scope设置为provided表示这个不会被打入war包当中。-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
第四步:修改主类
java
@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服务器,并访问。