SpringBoot项目从搭建到发布一条龙

网友投稿 251 2022-11-03


SpringBoot项目从搭建到发布一条龙

前言

第二章 使用IDEA搭建一个简单的SpringBoot项目——初始化项目

前言

创建项目

2.选择“Spring Initializr”,点击next;(jdk1.8默认即可)

3.完善项目信息,组名可不做修改,项目名可做修改;最终建的项目名为:test,src->main->java下包名会是:com->example->test;点击next;

4.Web下勾选Spring Web Start,(网上创建springboot项目多是勾选Web选项,而较高版本的Springboot没有此选项,勾选Spring Web Start即可,2.1.8版本是Spring Web);Template Englines勾选Thymeleaf;SQL勾选:mysql Driver,JDBC API 和 MyBatis Framework三项;点击next;

5.选择项目路径,点击finish;打开新的窗口;

6.刚创建好的项目目录结构

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210204142502112.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3llamlhbGlhbmd6aQ==,size_16,color_FFFFFF,t_70)

7.点击右侧的Maven,点击设置(扳手图标)进行项目Maven仓库的配置;

8.(1)选择本地Maven路径;(2)勾选配置文件后边的选项,然后修改为本地Maven的配置文件,它会根据配置文件直接找到本地仓库位置;

9.配置完后,如果没有自动导包,可以点击左上角重新导包按钮,或者呢个下载按钮,选择下载所有源文件和文档

10.在templates文件下新建index.html页面,作为启动的初始页面;

你好!初学者,我是SpringBoot的简单启动页面!

11.在com.example.test下新建controller文件夹,在controller文件夹下建一个简单的helloController类;(Controller类要添加@Controller注解,项目启动时,SpringBoot会自动扫描加载Controller)

package com.example.test.controller;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

@Controller

public class HelloController {

@RequestMapping("/index")

public String sayHello(){

return "index";

}

}

12.在resources文件夹下application中先配置DataSource基本信息,application文件有两种文件格式,一种是以.properties为后缀,一种是以.yml为后缀的,两种配置方式略有差别,详情可参考这个网址:https://jb51.net/article/154115.htm;在这我是用.yml后缀的文件格式。右键application文件选择Refact,选择Rename,将后缀改为yml;

spring:

datasource:

name: test #数据库名

url: jdbc:mysql://localhost:3306/test #url

username: root #用户名

password: 123456 #密码

driver-class-name: com.mysql.jdbc.Driver #数据库链接驱动

13.运行项目启动类TestApplication.java

!可以发现上面有一个WARN警告,那是因为还没有配置编写MyBatis的相关文件,下面会进行详解;

2019-08-02 09:14:27.473 WARN 9120 --- [

main] o.m.s.mapper.ClassPathMapperScanner

: No MyBatis mapper was found in '[com.example.test]' package. Please check your configuration.

14.在浏览器中输入localhost:8080,回车显示初始的index界面;到这项目的初步搭建已经完成,下面可以下一些简单的业务逻辑,比如从数据库获取信息,登录之类的简单功能;

15.在进行下一步编写时,我们先来链接一下数据库;点击右侧的Database,点“加号”,新建数据库链接;

16.填写数据库相关信息,点击Test Connection;

17.如果链接失败可能是驱动的问题,点击左上角的小扳手,进入数据库设置界面

18.连接成功后,显示数据库信息,user表的基本信息也显示了,下面就照这个来了;

19.往下的我就没照做了,下面是我自己搭建的项目

20.我的数据库,连的mycat。启动三台虚拟机,运行linux1和linux2中的mysql,运行Linux3中的mycat,关闭防火墙

第三章 整合全局捕获异常

前言

@ExceptionHandler 表示拦截异常

• @ControllerAdvice 是 controller 的一个辅助类,最常用的就是作为全局异常处理的切面类

• @ControllerAdvice 可以指定扫描范围

• @ControllerAdvice 约定了几种可行的返回值,如果是直接返回 model 类的话,需要使用 @ResponseBody 进行 json 转换

o 返回 String,表示跳到某个 view

o 返回 modelAndView

o 返回 model + @ResponseBody

@ControllerAdvice

1. 控制层代码

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

@RestController

public class ErrorController {

// 全局捕获异常 使用AOP技术,采用异常通知

@RequestMapping("/getUser")

public String getUser(int i){

int j = 1/i;

return "success"+j;

}

}

2.异常拦截代码

import org.springframework.web.bind.annotation.ControllerAdvice;

import org.springframework.web.bind.annotation.ExceptionHandler;

import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;

import java.util.Map;

@ControllerAdvice(basePackages = "com.example.test.controller")

public class GlobalExceptionHandler {

@ExceptionHandler(RuntimeException.class)

@ResponseBody

public Map errorResult(){

Map errorResultMap = new HashMap<>();

errorResultMap.put("errorCode","500");

errorResultMap.put("errorMsg","系统错误!");

return errorResultMap;

}

}

3.运行结果

第四章 springboot+log4j.yml配置日志文件

前言

一,Maven 依赖 pom.xml配置

1. 掉默认日志,以便切换到log4j2的日志依赖

org.springframework.boot

spring-boot-starter

org.springframework.boot

spring-boot-starter-logging

2. 然后添加如下两个日志依赖

org.springframework.boot

spring-boot-starter-log4j2

com.fasterxml.jackson.dataformat

jackson-dataformat-yaml

二,在工程根目录下添加 lo4g2.yml 配置文件

1, 文件存放位置

2, 配置文件内容

# 共有8个级别,按照从低到高为:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF。

Configuration:

status: warn

monitorInterval: 30

Properties: # 定义全局变量

Property: # 缺省配置(用于开发环境)。其他环境需要在VM参数中指定,如下:

#测试:-Dlog.level.console=warn -Dlog.level.xjj=trace

#生产:-Dlog.level.console=warn -Dlog.level.xjj=info

- name: log.level.console

value: info

- name: log.path

value: log

- name: project.name

value: opendoc

- name: log.pattern

value: "%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p ${PID:-} [%15.15t] %-30.30C{1.} : %m%n"

Appenders:

Console: #输出到控制台

name: CONSOLE

target: SYSTEM_OUT

PatternLayout:

pattern: ${log.pattern}

# 启动日志

RollingFile:

- name: ROLLING_FILE

fileName: ${log.path}/${project.name}.log

filePattern: "${log.path}/historyRunLog/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"

PatternLayout:

pattern: ${log.pattern}

Filters:

# 一定要先去除不接受的日志级别,然后获取需要接受的日志级别

ThresholdFilter:

- level: error

onMatch: DENY

onMismatch: NEUTRAL

- level: info

onMatch: ACCEPT

onMismatch: DENY

Policies:

TimeBasedTriggeringPolicy: # 按天分类

modulate: true

interval: 1

DefaultRolloverStrategy: # 文件最多100个

max: 100

# 平台日志

- name: PLATFORM_ROLLING_FILE

ignoreExceptions: false

fileName: ${log.path}/platform/${project.name}_platform.log

filePattern: "${log.path}/platform/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"

PatternLayout:

pattern: ${log.pattern}

Policies:

TimeBasedTriggeringPolicy: # 按天分类

modulate: true

interval: 1

DefaultRolloverStrategy: # 文件最多100个

max: 100

# 业务日志

- name: BUSSINESS_ROLLING_FILE

ignoreExceptions: false

fileName: ${log.path}/bussiness/${project.name}_bussiness.log

filePattern: "${log.path}/bussiness/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"

PatternLayout:

pattern: ${log.pattern}

Policies:

TimeBasedTriggeringPolicy: # 按天分类

modulate: true

interval: 1

DefaultRolloverStrategy: # 文件最多100个

max: 100

# 错误日志

- name: EXCEPTION_ROLLING_FILE

ignoreExceptions: false

fileName: ${log.path}/exception/${project.name}_exception.log

filePattern: "${log.path}/exception/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"

ThresholdFilter:

level: error

onMatch: ACCEPT

onMismatch: DENY

PatternLayout:

pattern: ${log.pattern}

Policies:

TimeBasedTriggeringPolicy: # 按天分类

modulate: true

interval: 1

DefaultRolloverStrategy: # 文件最多100个

max: 100

# DB 日志

- name: DB_ROLLING_FILE

ignoreExceptions: false

fileName: ${log.path}/db/${project.name}_db.log

filePattern: "${log.path}/db/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"

PatternLayout:

pattern: ${log.pattern}

Policies:

TimeBasedTriggeringPolicy: # 按天分类

modulate: true

interval: 1

DefaultRolloverStrategy: # 文件最多100个

max: 100

Loggers:

Root:

level: info

AppenderRef:

- ref: CONSOLE

- ref: ROLLING_FILE

- ref: EXCEPTION_ROLLING_FILE

Logger:

- name: platform

level: info

additivity: false

AppenderRef:

- ref: CONSOLE

- ref: PLATFORM_ROLLING_FILE

- name: bussiness

level: info

additivity: false

AppenderRef:

- ref: BUSSINESS_ROLLING_FILE

- name: exception

level: debug

additivity: true

AppenderRef:

- ref: EXCEPTION_ROLLING_FILE

- name: db

level: info

additivity: false

AppenderRef:

- ref: DB_ROLLING_FILE

# 监听具体包下面的日志

# Logger: # 为com.xjj包配置特殊的Log级别,方便调试

# - name: com.xjj

# additivity: false

# level: ${sys:log.level.xjj}

# AppenderRef:

# - ref: CONSOLE

# - ref: ROLLING_FILE

3, 在application.yml引入log4j2.yml

#在application.yml引入log4j2.yml

logging:

config: classpath:log4j2.yml

三, 不同日志枚举类

1, 本地日志枚举类

package com.tcs.irecr.util;

/**

*

* 本地日志枚举

* 由于配置了4个文件存放不同日志,分别为平台日志(${project.name}_platform.log)、 业务日志(${project.name}_bussiness.log)、错误日志(${project.name}_exception.log)、DB 日志(${project.name}_db.log),

* 文件夹外面为运行日志,不同文件日志级别不一样,因此程序员在开发时候需要注意引入不同日志,

* 也就是说开发出现的日志,程序员可以进行分类,分别调用公共方法即可。

* 公共类编辑如下;

*

* @author 1632369

*

*/

public enum LogEnum {

BUSSINESS("bussiness"),PLATFORM("platform"),DB("db"),EXCEPTION("exception");

private String category;

LogEnum(String category) {

this.category = category;

}

public String getCategory() {

return category;

}

public void setCategory(String category) {

this.category = category;

}

}

四, 不同日志工具类util编辑

1, 本地日志参考类

package com.tcs.irecr.util;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

/**

* 本地日志参考类

* @author Administrator

*

*/

public class LogUtils {

/**

* 获取业务日志logger

*

* @return

*/

public static Logger getBussinessLogger() {

return LoggerFactory.getLogger(LogEnum.BUSSINESS.getCategory());

}

/**

* 获取平台日志logger

*

* @return

*/

public static Logger getPlatformLogger() {

return LoggerFactory.getLogger(LogEnum.PLATFORM.getCategory());

}

/**

* 获取数据库日志logger

*

* @return

*/

public static Logger getDBLogger() {

return LoggerFactory.getLogger(LogEnum.DB.getCategory());

}

/**

* 获取异常日志logger

*

* @return

*/

public static Logger getExceptionLogger() {

return LoggerFactory.getLogger(LogEnum.EXCEPTION.getCategory());

}

}

五, 运行时自动在工程目录下生产日志目录和日志文件

点这里

第五章 Spring Boot集成lombok

前言

简洁代码,很实用的插件

一,Maven 依赖 pom.xml配置

1. 导入依赖包

org.projectlombok

lombok

2. 使用IDEA需要安装Lombok插件,我这里已经下载好,如果没下载安装点击install进行下载安装即可

3. 实体类演示@Data----简化get/set,toString等方法,@Slf4j------简化 protected final Logger logger = LoggerFactory.getLogger(this.getClass());

import lombok.Data;

@Data

public class UserInfoDto {

private Integer id;

private String name;

}

import com.example.test.dto.UserInfoDto;

import lombok.extern.slf4j.Slf4j;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

@Controller

@Slf4j

public class helloController {

@RequestMapping("/index")

public String sayHello(){

UserInfoDto userInfoDto = new UserInfoDto();

userInfoDto.setId(1);

userInfoDto.setName("天下第一");

log.info("打印结果是-----"+userInfoDto.toString());

return "index";

}

}

3.其他特性

@Data 标签,生成getter/setter toString()等方法

@NonNull : 让你不在担忧并且爱上NullPointerException

@CleanUp : 自动资源管理:不用再在finally中添加资源的close方法

@Setter/@Getter : 自动生成set和get方法

@ToString : 自动生成toString方法

@EqualsAndHashcode : 从对象的字段中生成hashCode和equals的实现

@NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor

自动生成构造方法

@Data : 自动生成set/get方法,toString方法,equals方法,hashCode方法,不带参数的构造方法

@Value : 用于注解final类

@Builder : 产生复杂的构建器api类

@SneakyThrows : 异常处理(谨慎使用)

@Synchronized : 同步方法安全的转化

@Getter(lazy=true) :

@Log : 支持各种logger对象,使用时用对应的注解,如:@Log4

第六章 Spring Boot使用@Async实现异步调用

前言

现实中校验excel时可能会用到,之前项目校验上传数据时我是单开了个线程完成通知,看这次能不能替换实现。

一,Controller类

1. 启动加上@EnableAsync

import com.example.test.service.MemberService;

import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.scheduling.annotation.EnableAsync;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

/**

* springboot异步调用

*/

@RestController

@Slf4j

@EnableAsync // 开启异步调用

public class MemberController {

@Autowired

private MemberService memberService;

@RequestMapping("/addMemberAndEmail")

public String addMemberAndEmail(){

log.info("1");

String result = memberService.addMemberAndEmail();

log.info("4");

return "result"+result;

}

}

2.需要执行异步方法上加入 @Async,在方法上加上@Async之后 底层使用多线程技术

import com.example.test.service.MemberService;

import lombok.extern.slf4j.Slf4j;

import org.springframework.scheduling.annotation.Async;

import org.springframework.stereotype.Service;

@Service

@Slf4j

public class MemberServiceImpl implements MemberService {

@Override

@Async // 相当于此方法单独开辟一个新线程执行

public String addMemberAndEmail() {

log.info("2");

try {

Thread.sleep(5000);

} catch (InterruptedException e) {

e.printStackTrace();

}

log.info("3");

return "2021新年好!!!";

}

}

3.执行结果未加 @Async和@Async

4.执行结果加 @Async和@Async

第七章 Spring Boot不同环境配置文件

前言

注意:yml文件冒号前一定要加空格…

一.@Value的使用与开发,测试,生产环境不同配置文件使用

1. 此处仅用开发环境文件做演示,建立application-dev.yml文件

2. 配置application.yml文件

代码

spring:

profiles:

active: dev

3. 演示代码controller层

import com.example.test.service.MemberService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

@RestController

public class ValueController {

@Autowired

private MemberService memberService;

@RequestMapping("/testValue")

public String testValue(){

return memberService.readUrlbyValue();

}

}

4. 演示代码servicer层

import com.example.test.service.MemberService;

import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Configuration;

import org.springframework.scheduling.annotation.Async;

import org.springframework.stereotype.Service;

@Service

@Slf4j

public class MemberServiceImpl implements MemberService {

@Value("${devurl}")

private String devurl;

@Override

@Async // 相当于此方法单独开辟一个新线程执行

public String addMemberAndEmail() {

log.info("2");

try {

Thread.sleep(5000);

} catch (InterruptedException e) {

e.printStackTrace();

}

log.info("3");

return "2021新年好!!!";

}

@Override

public String readUrlbyValue() {

return devurl;

}

}

5. 运行结果

![在这里插入代码片](https://img-blog.csdnimg.cn/20210205103858693.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3llamlhbGlhbmd6aQ==,size_16,color_FFFFFF,t_70)

第八章 Spring Boot与mybatis三剑客

前言

说实话今天我为了整合这个踩了不少坑,花了将近半天时间才成功。这里记下来避免好学者和我一样查资料浪费时间

一.逆向生成文件–神器MyBatis-Generator

1.首先不多说pom.xml导入需要架包,这里踩坑一,我之前用的mysql-connector-java版本是8.0.12,而我的mysql版本只有 5.7.33,生成时会报 CLIENT_PLUGIN_AUTH is required错误,而且驱动应该改成"com.mysql.cj.jdbc.Driver"而不是"com.mysql.jdbc.Driver"。

com.alibaba

druid-spring-boot-starter

1.1.10

mysql

mysql-connector-java

5.1.41

runtime

org.mybatis.generator

mybatis-generator-maven-plugin

2. 配置generatorConfig.xml文件, 配置文件中的是配置驱动的一个简单的方式,可以通过location制定路径。

​ 元素用于指定生成一组对象的环境。例如指定要连接的数据库,要生成对象的类型和要处理的数据库中的表。其中的defaultModelType属性很重要,这个属性定义了MBG如何生成实体类,推荐使用flat模式,为每一张表只生成一个包含表所有字段的实体类。

​ 指定生成实体类的生成路径,trimStrings属性会对查询条件进行trim操作,默认值是false。

​ 指定生成xml文件的路径。

​ 指定生成dao接口。

可以配置多个,用于指定生成数据库中的那个表的底层类,可以指定生成的实体类的name,enableCountXXX属性可以去除不需要的sql方法,其中columnOverride可以指定表中使用的枚举类,ignoreColumn可以忽略表中的字段,columnOverride和ignoreColumn可以指定0个或多个。

PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"

"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

location="F:\repository\mysql\mysql-connector-java\5.1.41\mysql-connector-java-5.1.41.jar"/>

connectionURL="jdbc:mysql://192.168.70.122:8066/TESTDB?useUnicode=true&characterEncoding=utf8&useSSL=false"

userId="root"

password="123456">

targetProject="src\main\java">

targetProject="src\main\java">

location="F:\repository\mysql\mysql-connector-java\5.1.41\mysql-connector-java-5.1.41.jar"/>

connectionURL="jdbc:mysql://192.168.70.122:8066/TESTDB?useUnicode=true&characterEncoding=utf8&useSSL=false"

userId="root"

password="123456">

connectionURL="jdbc:mysql://192.168.70.122:8066/TESTDB?useUnicode=true&characterEncoding=utf8&useSSL=false"

userId="root"

password="123456">

targetProject="src\main\java">

targetProject="src\main\java">

targetProject="src\main\java">

targetProject="src\main\java">

3. mvn install 和点击myBatis-Generator生产文件

4. 结果

二.mybatis plugin

1. mybatis plugin作为一款优秀的mybatis跳转插件

2. 安装重启,分页插件就不说了,项目中用别的插件。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:ASP.NET中使用网络驱动器
下一篇:数据库服务器(SQL SERVER)的安全设置
相关文章

 发表评论

暂时没有评论,来抢沙发吧~