之前写过一篇关于springboot的搭建,由于是初学,写的不是很好,最近重新学习springboot,这里记录一下比较全的搭建,并集成其他功能
1.环境 STS(其他开发工具大同小异) , maven 3.6 、 jdk1.8 ,springboot版本 2.1.2
2.创建简单的maven项目,在pom文件中引入以下依赖
<!-- 编码格式和编译版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!-- 父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
</parent>
<dependencies>
<!-- web支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 排除默认日志,加入log4j2 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 日志,如果不排除掉上面的日志,这个不生效 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
最主要的就是父依赖,和一个 web 支持的依赖,就可以完成最简单的项目,写一个方法测试一下
目录结构如上图,App这个类要在其他类的上级或同级目录,原因在于@SpringBootApplication这个标签默认扫描规则,
启动main方法,浏览器输入 localhost:8080/hello
最基本的项目搭建完成,集成其他功能
3.热部署
eclipse中只需要加入一个依赖即可
<!-- 热部署,在idea中需要加入插件,并且将编译改成自动编译 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
这时不需要重启项目,保存后即可直接访问,实现热部署
4.集成mybatis
引入mybatis依赖和数据库连接池依赖
<!-- 集成mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
5.逆向工程生成实体,mapper接口和mapper的xml文件,首先在mysql数据库中新建一张表
写一个逆向工程的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 数据库驱动:选择你的本地硬盘上面的数据库驱动包-->
<classPathEntry location="D:\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar"/>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="true"/>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库链接URL,用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/sb" userId="root" password="1234">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成模型的包名和位置-->
<javaModelGenerator targetPackage="com.enjoy.domain" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成映射文件的包名和位置-->
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成DAO的包名和位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.enjoy.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->
<table tableName="enjoy_user" domainObjectName="User" enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false">
</table>
</context>
</generatorConfiguration>
在pom文件中引入插件
<!--逆向工程插件 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
用 命令执行即可 mvn mybatis-generator:generate
右键项目 ----> Run as ---> Maven Build... --->
即可生成实体,xml和dao接口前提你项目集成好maven
这三个文件是逆向工程生成的,
配置application.properties
# MYSQL 配置
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/sb?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=1234
# sql文件的xml路径
mybatis.mapperLocations=classpath:mapper/*.xml
# 服务端口
server.port=8080
写一个简单的测试,向数据库中插入一条数据
App需要添加一个注解,表明扫描dao层的位置
启动项目,访问 localhost:8080/test/insert/username/小明/password/123456
页面返回成功,数据库插入信息成功
6.springboot的单元测试,查询刚刚插入的数据,pom文件引入测试依赖
<!-- 测试类 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
写一个测试方法,关键是这些注解
可以看出打印了结果,说明单元测试已经正确配置
7.springboot集成事务
在需要加入事务的类上加一个注解 @Transactional
8.全局异常捕获类,在类上加注解@ControllerAdvice,方法上加@ExceptionHandler,值为运行时异常,运行时出现异常则将被这个类捕获
9. 资源不存在时的异常不能被全局异常捕获,则需要配置一个错误页面,用到的lambda表达式
在写一个404.do的处理类
当输入一个不存在的路径时,就会被这个类处理
10.访问静态资源,在resources目录下新建一个文件夹,叫stati或者public,向里面放入一张jpg图片,然后浏览器
访问 localhost:8080/XXX.jpg,就能看到这个图片
11.支持jsp页面的集成
11.1 pom导入对jsp支持的依赖
<!--el表达式和jsp支持 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
11.2 application.properties文件加入视图解析器相关配置
#jsp页面前缀和后缀
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
11.3,由于这里是springboot项目,没有WEB-INF等相关目录,自己手动创建,红线内都是手动创建的,也可以在pom文件中指定<package>war</package>,会出现相应的目录结构,如果缺少目录还需要手动创建
最后写一个测试方法
访问后得到相关页面
12.集成 thymeleaf 模板引擎
12.1首先将pom文件中的对jsp支持的依赖注释掉,加入对thymeleaf 支持的依赖
<!-- 支持thymeleaf模板 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
12.2 配置文件中增加一条配置 spring.thymeleaf.cache=false,关闭缓存
# 关闭模板缓存
spring.thymeleaf.cache=false
12.3,resources目录下创建一个 templates文件夹,将html文件放进去,写一个测试方法
浏览器访问
thymeleaf 模板引擎也集成好了,至于获取复杂对象则需要了解相关知识,这里不做演示
13 集成swagger,加入依赖
<!-- swagger 支持 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
13.1 写一个配置类
13.2:写一个对应的,controller,
启动项目,浏览器输入 localhost:8080/swagger-ui.html
可以看到对应的方法,直接测试,输入参数,得到结果,swagger集成成功
14.日志集成 ,默认导入了lockback,pom文件不需要再导入其他依赖
配置文件加上日志级别
logging.level.root=INFO :日志级别设置为info
logging.level.com.enjoy.controller=DEBUG:com.enjoy.controller这个包下的级别设置为debug
logging.file =F:/log/enjoy.log 日志输出到F:/log/enjoy.log 路径下
测试,在需要加日志的类上加入 private final Logger log = LoggerFactory.getLogger(UserController.class);引入的包是 org.slf4j.Logger,则调用 log.info("xxx");就会打印对应的日志
上面配置的默认的lookback日志,还有一种日志log4j2,需要排除lockback,在引入log4j2才能生效
,其他不用变,日志直接使用,同上面用法一样
15.AOP的日志应用,写一个切面类,设置参数,方法执行前后调用该类的方法,无需每个方法都做重复工作,简化开发
<!-- aop支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
执行相关方法,会打印出相应的日志
16 打包部署
16.1,打jar包,pom文件中需要添加几个插件
<!-- 编译级别 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- 不配置会出现找不到主入口。Jar无法跑起来。 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- 打包跳过测试 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
配置好以后,可以用eclipse的maven打包 右键项目——>Run As——>Maven clean先清理一下,再安装Run As——>maven install,提示成功以后,在项目的target目录下找到该项目的jar包文件,在这里打开命令窗口,输入 java -jar xxx.jar,即可启动项目
也可以用maven命令,在命令窗口手动打包,打包要在pom文件同级目录下打开命令窗口,mvn clean package命令打包,在target目录下能找到这个jar包,按上面步骤启动即可
打war包,需要在打jar包的基础上做两处修改
16.1:修改pom文件 将<package>jar</package> 改成<package>war</package>,更新一下
16.2:在App.class中修改主方法
public class App extends SpringBootServletInitializer{
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(App.class);
}
需要继承SpringBootServletInitializer这个方法,重写configure方法,修改完按照上面的命令打包,就会打成war包
部署到tomcat9 中,将war包方在webapp下,启动,浏览器输入localhost:8080/项目名/路径,就可以访问了,如果不想输入项目名直接访问,需要将war包改成ROOT.war,放到webapp中,启动后直接访问就可以