SpringBoot开发及学习
SpringBoot是Spring新出的一个框架,他的目的一如始初- 简化开发。我们开发项目的时候,为了让项目运行起来,我们要考虑很多架构、配置、依赖等问题,这些问题其实每个项目都要考虑,而且每个项目的开发都有固定的模版,这些重复的工作是每个项目的样板代码,SpringBoot做的就是帮我们完成这些重复行的工作,让我们只关注业务逻辑。
主要帮我们完成了以下几个部分:
1、自动装配:针对Spring应用程序常见的应用功能,SpringBoot自动提供相关的配置。
2、起步依赖:告诉SpringBoot需要什么功能后,他能帮我们引入需要的jar包。
3、命令行界面:这个这里不介绍。
4、Actuator:监控观察你的程序运行。
接下来,我们创建一个简单的SpringBoot应用:
一、创建骨架
我们要使用Spring Initializr 来生成一个项目框架,可以通过sts、idea、SpringBoot CLI和web界面来完成Spring Initializr 的工作,我们这里选用的是web界面,访问网址:http://start.spring.io/
根据你的情况,填写表单,点击generate Project 按钮,生成项目框demo.zip并下载到本地。这个框架除了业务代码,该有的都有了。将demo.zip复制到sts工作空间,解压后,删除多余的代码,只留下src文件夹和pom.xml文件,在sts中通过引入maven项目的方式引入demo项目。
pom.xml报错,原因是spring-boot-starter-parent默认用的是2.1.3,这里有的jar我的私服上下载不到,改成低点的版本2.0.2问题就解决了。如果你连接的是中央仓库,且网络通畅,是不会有这个问题的。
我们在Spring initializr中选择了web和mysql,给我们生成的pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
我们看的他给我们生成的项目结构是这样的,使用的jdk版本是1.8。(需要强调的是,SpringBoot使用的jdk版本要是1.8或高于1.8)
和我们以往的web项目比,最大的不同应该就是我们的项目里居然没有了web.xml,打包类型也变成了jar。那这样行不行呢?我们写个简单的action,启动一下应用试试。
这里要注意的是,springBoot已经给我们内嵌了一个tomcat,所以我们不需要自己再搭建一个,因为是内置tomcat,我们的项目访问也有一点不同就是,访问的时候不需要加上项目名了,直接访问资源就可以,这里我们直接访问http://localhost:8080 就可以进入我们action。
启动:选中项目-> 右键debug as -> spring Boot app (其他启动方式可以参考https://my.oschina.net/oosc/blog/1627384)
打开浏览器,输入:http://localhost:8080
既然成功了,我们来逐一介绍一下,他给我们生成的东西都是干啥的:
1、 2、application.properties默认是空的 3、
这是为我们生成了一个基本骨架,那我们接下来要看,怎么在其中开发,开发之后怎么部署应用。我们来通过开发一个ssm框架的web项目来介绍具体操作。
二、开发应用
1、自定义配置springBoot,使其支持jsp(SpringBoot虽然支持JSP,但是官方不推荐使用,推荐使用thymeleaf)
1)、配置application.properties
#关闭默认模板引擎
spring.thymeleaf.cache=false
spring.thymeleaf.enabled=false
#jsp 支持
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
2)、加入依赖(切记:这三个依赖都是必须的)
<!--jsp支持 start--> <!-- servlet 依赖. --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <!--jsp支持 end-->
3)、控制层建议使用@Controller,不要使用@RestController,毕竟不是每一个方法都返回JSON的,有的需要跳转到界面。
package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; /** * @author thc * @E-mail 2353635701@qq.com * @date 2019年2月19日 下午3:12:03 * @Description 类描述 */ @Controller public class DemoController { @RequestMapping(value = {"/", "/view"} ,method=RequestMethod.GET) public String helloworld() { System.out.println("helloworld!!"); return "index"; } }
4)、 像往常的web项目一样,在文件夹src下创建main\webapp\WEB-INF\views\index.jsp测试页面。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>index</title> <!-- Tell the browser to be responsive to screen width --> <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> </head> <body class="hold-transition login-page"> <center> <h3>你好,欢迎 !!!</h3> </center> </body> </html>
启动应用,访问http://localhost:8080,测试成功!!
2、支持mybatis做数据库持久化
1)、添加依赖
<!-- mybatis start --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <!-- mysql 连接 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- mybatis end -->
备份程序!!!
2)、添加自定义配置(添加mybatis支持方法一,本人不支持使用,官方配置文档不好找,反正我是没找到全部的数据库连接池配置参数)
修改application.properties,添加mybatis和dataSource相关配置
#使用mybatis连接数据库信息 #mybatis自定义配置信息 mybatis.mapper-locations = classpath:mybatis/mapper/*Mapper.xml mybatis.config-location = classpath:mybatis/mybatis_config.xml mybatis.type-aliases-package = com.example.demo.dao.db #数据库连接信息 spring.datasource.driver-class-name= com.mysql.jdbc.Driver spring.datasource.url = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8 spring.datasource.username = root spring.datasource.password = 123
写样例测试,数据库表可以随意创建两张,添加测试程序
a、在src/main/resources下创建mybatis文件夹,在mybatis文件夹下创建mybatis_config.xml(内容如下)文件、generator_test.xml文件(方向工程生成文件内容如下)和mapper文件夹(这个要与application.properties中的配置一致classpath:mybatis/mapper),在src/main/java创建com.example.demo.dao.db包,使用mybatis方向工程生成数据代码。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> </configuration>
<?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"> <!-- 配置Run As Maven build : Goals 参数 : mybatis-generator:generate -Dmybatis.generator.overwrite=true --> <!-- 配置 tableName,使用 Run As Maven build 生成 dao model 层 --> <generatorConfiguration> <!-- 配置文件路径 --> <!-- <properties url="${mybatis.generator.generatorConfig.properties}"/> --> <!-- <properties resource="generatorConfig.properties"/> --> <!--数据库驱动包路径 --> <classPathEntry location="E:\m2\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar" /> <context id="EditionManagerTables" targetRuntime="MyBatis3"> <!-- mybatio分页插件 --> <plugin type="org.mybatis.generator.plugins.RowBoundsPlugin"></plugin> <!--关闭注释 --> <commentGenerator> <property name="suppressAllComments" value="true" /><!-- 是否取消注释 --> <property name="suppressDate" value="true" /> <!-- 是否生成注释代时间戳 --> </commentGenerator> <!--数据库连接信息 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test" userId="root" password="123"> </jdbcConnection> <!-- 类型转换 --> <javaTypeResolver> <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) --> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!--生成的model 包路径 --> <javaModelGenerator targetPackage="com.example.demo.dao.db.model" targetProject="demo/src/main/java"> <!-- 是否在当前路径下新加一层schema,eg:fase路径cn.ffcs.test.domain", true:cn.ffcs.test.domain".[schemaName] --> <property name="enableSubPackages" value="ture" /> <!-- 是否针对string类型的字段在set的时候进行trim调用 --> <property name="trimStrings" value="true" /> <!-- <property name="rootClass" value="com.sinosig.xb.rms.base.BaseEntity"/> --> </javaModelGenerator> <!--生成xml mapper文件 路径 --> <sqlMapGenerator targetPackage="mybatis.mapper" targetProject="demo/src/main/resources"> <!-- 是否在当前路径下新加一层schema,eg:fase路径cn.ffcs.test.domain", true:cn.ffcs.test.domain".[schemaName] --> <property name="enableSubPackages" value="ture" /> </sqlMapGenerator> <!-- 生成的Dao接口 的包路径 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.demo.dao.db" targetProject="demo/src/main/java"> <property name="enableSubPackages" value="ture" /> <!-- baseDao --> <!-- <property name="rootInterface" value="com.xb.alert.platform.db.dao.BaseDao" /> --> </javaClientGenerator> <!--对应数据库表名 --> <!-- schema即为数据库名 tableName为对应的数据库表 domainObjectName要生成的实体类名 enable*ByExample是否生成 example类 --> <!-- <table tableName="ts_user" schema="" enableInsert="true" --> <!-- <table tableName="tp_%" schema="" enableInsert="true" useGeneratedKeys="true" keyProperty="id" --> <!-- <table tableName="te_employee_info" schema="" enableInsert="true" --> <!-- <table tableName="%" schema="" enableInsert="true" --> <table tableName="%" schema="" enableInsert="true" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true"> <!-- enableCountByExample="true" enableUpdateByExample="false" enableDeleteByExample="false" --> <!-- enableSelectByExample="true" selectByExampleQueryId="true"> --> <!-- 忽略列,不生成bean 字段 <ignoreColumn column="FRED" /> --> <!-- 指定列的java数据类型 <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> --> </table> </context> </generatorConfiguration>
b、创建service层:创建包com.example.demo.service、com.example.demo.service.impl及接口TestDemoService和实现类TestDemoServiceImpl如下:
package com.example.demo.service; import com.example.demo.dao.db.model.TsUser; public interface TestDemoService { public boolean testTransactional(); public TsUser selectByPrimaryKey(int id); }
package com.example.demo.service.impl; import javax.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.example.demo.dao.db.TdScoreMapper; import com.example.demo.dao.db.TsUserMapper; import com.example.demo.dao.db.model.TdScore; import com.example.demo.dao.db.model.TsUser; import com.example.demo.service.TestDemoService; @Service public class TestDemoServiceImpl implements TestDemoService{ @Resource TsUserMapper mapper; @Resource TdScoreMapper scMapper; public TsUser selectByPrimaryKey(int id){ return mapper.selectByPrimaryKey(id); } @Transactional public boolean testTransactional(){ try { TsUser tu = new TsUser(); tu.setId(1); tu.setName("张三100"); mapper.updateByPrimaryKey(tu); TdScore sc = new TdScore(); sc.setId(1); sc.setScore(100); scMapper.updateByPrimaryKey(sc); } catch (Exception e) { e.printStackTrace(); } return true; } }
c、添加修改action代码如下
package com.example.demo.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.example.demo.dao.db.model.TsUser; import com.example.demo.service.TestDemoService; /** * @author thc * @E-mail 2353635701@qq.com * @date 2019年2月19日 下午3:12:03 * @Description 类描述 */ @Controller public class DemoController { @Autowired TestDemoService service; @RequestMapping(value = {"/", "/view"} ,method=RequestMethod.GET) public String helloworld() { System.out.println("helloworld!!"); service.testTransactional(); // 查询数据库 TsUser tu = service.selectByPrimaryKey(1); System.out.println("数据库查出用户名" + tu.getName()); return "index"; } }
d、修改应用启动入口DemoApplication.java,添加@EnableTransactionManagement注解,用来支持spring事物;添加@MapperScan("com.example.demo.dao.db"),用来配置扫描**Mapper接口,也可以使用@Mapper注解,二选一(注解写法如下第二张截图)
e、启动测试:控制台打印用户名,成功!!
备份程序!!!! 因为这个也是用来支持mybaits的介绍,和上面的操作重复了,所有我们导入之前备份的程序,再做之下操作。
3)、支持读取自定义的配置文件(添加mybatis支持方法二,这个学习成本很小,老方式配置DataSource参数就可以了)
这个操作就是使用springBoot对xml配置文件的支持,直接用程序读我们原来的mybaits配置文件(官方文档 https://docs.spring.io/spring-boot/docs/2.1.3.RELEASE/reference/htmlsingle/#using-boot-importing-xml-configuration)
a、在src/main/resources下创建mybatis文件夹,在mybatis文件夹下创建mybatis_config.xml(内容如下)文件、generator_test.xml文件(方向工程生成文件内容如下)和mapper文件夹(这个要与application.properties中的配置一致classpath:mybatis/mapper),在src/main/java创建com.example.demo.dao.db包,使用mybatis方向工程生成数据代码。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <!-- 自动扫描 --> <!-- <context:component-scan base-package="com.sinosig.xb.em.*" /> --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <!-- 基本属性 url、user、password --> <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull" /> <property name="username" value="root" /> <property name="password" value="123" /> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="1" /> <property name="minIdle" value="1" /> <property name="maxActive" value="20" /> <property name="maxIdle" value="20"></property> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="60000" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="validationQuery" value="SELECT 'x'" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <!-- 打开PSCache,并且指定每个连接上PSCache的大小 --> <property name="poolPreparedStatements" value="false" /> <!-- 配置监控统计拦截的filters --> </bean> <!-- MyBatis配置 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 --> <!-- <property name="typeAliasesPackage" value="com.hjf.boot.api.domain" /> --> <!-- 显式指定Mapper文件位置 --> <property name="mapperLocations" value="classpath*:mybatis/mapper/*Mapper.xml" /> </bean> <!-- 扫描basePackage下所有以@MyBatisRepository标识的 接口 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.demo.dao.db" /> <!-- <property name="annotationClass" value="com.hjf.boot.demo.boot_mybatis.dao.Mapper" /> --> </bean> <!-- 开启事务注解驱动 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 自动扫描,多个包以 逗号分隔 <context:component-scan base-package="com.sinosig.xb.em"/> --> <context:component-scan base-package="com.example.demo.dao.db"/> <aop:aspectj-autoproxy /> </beans>
<?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"> <!-- 配置Run As Maven build : Goals 参数 : mybatis-generator:generate -Dmybatis.generator.overwrite=true --> <!-- 配置 tableName,使用 Run As Maven build 生成 dao model 层 --> <generatorConfiguration> <!-- 配置文件路径 --> <!-- <properties url="${mybatis.generator.generatorConfig.properties}"/> --> <!-- <properties resource="generatorConfig.properties"/> --> <!--数据库驱动包路径 --> <classPathEntry location="E:\m2\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar" /> <context id="EditionManagerTables" targetRuntime="MyBatis3"> <!-- mybatio分页插件 --> <plugin type="org.mybatis.generator.plugins.RowBoundsPlugin"></plugin> <!--关闭注释 --> <commentGenerator> <property name="suppressAllComments" value="true" /><!-- 是否取消注释 --> <property name="suppressDate" value="true" /> <!-- 是否生成注释代时间戳 --> </commentGenerator> <!--数据库连接信息 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test" userId="root" password="123"> </jdbcConnection> <!-- 类型转换 --> <javaTypeResolver> <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) --> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!--生成的model 包路径 --> <javaModelGenerator targetPackage="com.example.demo.dao.db.model" targetProject="demo/src/main/java"> <!-- 是否在当前路径下新加一层schema,eg:fase路径cn.ffcs.test.domain", true:cn.ffcs.test.domain".[schemaName] --> <property name="enableSubPackages" value="ture" /> <!-- 是否针对string类型的字段在set的时候进行trim调用 --> <property name="trimStrings" value="true" /> <!-- <property name="rootClass" value="com.sinosig.xb.rms.base.BaseEntity"/> --> </javaModelGenerator> <!--生成xml mapper文件 路径 --> <sqlMapGenerator targetPackage="mybatis.mapper" targetProject="demo/src/main/resources"> <!-- 是否在当前路径下新加一层schema,eg:fase路径cn.ffcs.test.domain", true:cn.ffcs.test.domain".[schemaName] --> <property name="enableSubPackages" value="ture" /> </sqlMapGenerator> <!-- 生成的Dao接口 的包路径 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.demo.dao.db" targetProject="demo/src/main/java"> <property name="enableSubPackages" value="ture" /> <!-- baseDao --> <!-- <property name="rootInterface" value="com.xb.alert.platform.db.dao.BaseDao" /> --> </javaClientGenerator> <!--对应数据库表名 --> <!-- schema即为数据库名 tableName为对应的数据库表 domainObjectName要生成的实体类名 enable*ByExample是否生成 example类 --> <!-- <table tableName="ts_user" schema="" enableInsert="true" --> <!-- <table tableName="tp_%" schema="" enableInsert="true" useGeneratedKeys="true" keyProperty="id" --> <!-- <table tableName="te_employee_info" schema="" enableInsert="true" --> <!-- <table tableName="%" schema="" enableInsert="true" --> <table tableName="%" schema="" enableInsert="true" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true"> <!-- enableCountByExample="true" enableUpdateByExample="false" enableDeleteByExample="false" --> <!-- enableSelectByExample="true" selectByExampleQueryId="true"> --> <!-- 忽略列,不生成bean 字段 <ignoreColumn column="FRED" /> --> <!-- 指定列的java数据类型 <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> --> </table> </context> </generatorConfiguration>
b、添加依赖
<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.3.12.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>4.3.12.RELEASE</version> </dependency>
c、修改应用启动入口DemoApplication.java
d、重复上面的测试方法,成功!!!!
3、支持logback配置(有两种读取方式) ,logback的依赖是springBoot的默认起步依赖,所以我们不需要单独引入依赖。
1)、application.properties直接配置logback日志设置
# LOGGING
logging.config= # Location of the logging configuration file. For instance `classpath:logback.xml` for Logback
logging.exception-conversion-word=%wEx # Conversion word used when logging exceptions.
logging.file= # Log file name. For instance `myapp.log`
logging.level.*= # Log levels severity mapping. For instance `logging.level.org.springframework=DEBUG`
logging.path= # Location of the log file. For instance `/var/log`
logging.pattern.console= # Appender pattern for output to the console. Only supported with the default logback setup.
logging.pattern.file= # Appender pattern for output to the file. Only supported with the default logback setup.
logging.pattern.level= # Appender pattern for log level (default %5p). Only supported with the default logback setup.
logging.register-shutdown-hook=false # Register a shutdown hook for the logging system when it is initialized.
#=========== 日志配置·简易(spring boot已经集成logback日志)=========
#controller层日志 WARN级别输出
#logging.level.com.example.demo.controller=WARN
#mapper层 sql日志 DEBUG级别输出
#logging.level.com.example.demo.service.impl=DEBUG
#logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n
#logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n
#打印运行时sql语句到控制台
spring.jpa.show-sql=true
# 同时使用,则只有logging.file生效
# 绝对路径或者相对路径
logging.file=logs/spring-boot-logging.log
# 设置目录
logging.path=/var/log
# 级别控制
# 默认级别为:ERROR、WARN、INFO,10MB时会切分一次
# 格式logging.level.* = LEVEL
# TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
logging.level.root=info
logging.level.com.example.demo=info
logging.level.com.example.demo.controller=WARN
2)、application.properties配置读取logback xml配置文件
a、application.properties添加配置读取logback.xml
# 自定义日志配置路径
logging.config=classpath:logging-config.xml
b、创建logback.xml文件
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,, --> <!-- appender是configuration的子节点,是负责写日志的组件。 --> <!-- ConsoleAppender:把日志输出到控制台 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d %p (%file:%line\)- %m%n</pattern> <!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 --> <charset>UTF-8</charset> </encoder> </appender> <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 --> <!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是demo.log --> <!-- 2.如果日期没有发生变化,但是当前日志的文件大小超过1KB时,对当前日志进行分割 重命名--> <appender name="demolog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>log/demo.log</File> <!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 --> <!-- TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 --> <!-- 文件名:log/demo.2017-12-05.0.log --> <fileNamePattern>log/demo.%d.%i.log</fileNamePattern> <!-- 每产生一个日志文件,该日志文件的保存期限为30天 --> <maxHistory>30</maxHistory> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成1KB看效果 --> <maxFileSize>1KB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <!-- pattern节点,用来设置日志的输入格式 --> <pattern> %d %p (%file:%line\)- %m%n </pattern> <!-- 记录日志的编码:此处设置字符集 - --> <charset>UTF-8</charset> </encoder> </appender> <!-- 控制台输出日志级别 --> <root level="info"> <appender-ref ref="STDOUT" /> </root> <!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 --> <!-- com.example.demo为根包,也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG --> <!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE --> <!-- <logger name="com.example.demo.controller" level="info"> --> <logger name="com.example.demo" level="debug"> <appender-ref ref="demolog" /> </logger> </configuration>
4、支持读profile
三、部署应用
1、jar包配置
对于web项目,springBoot默认的打包方式配置的是jar包,他帮我们内嵌了一个tomcat,我们只需要使用我们常用的打包工具打包,通过部署jar包的方式部署到服务器上即可。
2、war包配置
虽然使用内置tomcat在开发上很方便,但是当我们在企业中开发的时候,有可能公司就是规定我们使用运维统一部署的tomcat服务器,那么我们就必须把项目打包成部署在tomcat中的war包,,这有有一个问题,我们的项目没有servlet容器的加载入口——web.xml文件。
这时候,我们就需要对程序做些修改:
1、修改pom.xml中的打包配置:<packaging>war</packaging>
2、创建一个servlet初始化入口:springBoot给我们提供了一个SpringBootServlertInitializer类。
官方文档:https://docs.spring.io/spring-boot/docs/2.1.4.BUILD-SNAPSHOT/reference/htmlsingle/ ctrl+f 搜索:SpringBootServletInitializer
我们要在我们的项目中写一个SpringBootServlertInitializer类的子类,重写他的configure()方法来完成配置,实现代码如下:
package com.example.demo; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; public class DemoServletInitializer extends SpringBootServletInitializer { @Override public SpringApplicationBuilder configure(SpringApplicationBuilder builder) { // DemoApplication 程序入口,指定Spring的配置 return builder.sources(DemoApplication.class); } }
3、使用maven打包命令打包
这个时候打成的war包既可以部署在tomcat中,也可以使用"java -jar 项目名.war"来作为jar包部署。