创建日期:2019-04-19
更新日期:2019-05-07
SpringBoot配置devtools实现热部署
参考网址:https://www.cnblogs.com/lspz/p/6832358.html
devtools的原理
深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
配置
<!-- 添加配置devtools依赖,实现热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- 添加配置fork,如果不进行配置则无法实现热部署 -->
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
Spring Boot 使用日志
引入日志
通常情况下,若使用Logback需要在pom文件中引入以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
但实际项目开发过程中,如下的依赖中,已经将该依赖及相应的依赖引入,因此,无需再配置该依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
配置日志
配置日志级别
注意:默认情况下,Spring Boot会使用Logback进行日志的记录,默认的日志级别是INFO。
通常情况下,我们使用slf4j作为日志的API,org.slf4j.Logger日志的级别分别有TRACE、DEBUG、INFO、WARN、ERROR五种级别,一般只使用后面的四个,且日志级别等级是递增的。
package com.example.demo.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Hello {
private Logger logger = LoggerFactory.getLogger(Hello.class);
@RequestMapping("/hello")
public String excute() {
logger.trace("默认trace级别");
logger.debug("默认debug级别");
logger.info("默认info级别");
logger.warn("默认warn级别");
logger.error("默认error级别");
return "Hello World";
}
}
执行的结果如下:
2019-04-19 14:15:29.380 INFO 2588 --- [nio-8080-exec-1] com.example.demo.controller.Hello : 默认info级别
2019-04-19 14:15:29.380 WARN 2588 --- [nio-8080-exec-1] com.example.demo.controller.Hello : 默认warn级别
2019-04-19 14:15:29.380 ERROR 2588 --- [nio-8080-exec-1] com.example.demo.controller.Hello : 默认error级别
由此可以发现,在默认情况下,日志的等级为INFO。
一般情况下,默认的配置已经足够使用,日志级别也设置的比较合理,但对于一些特别的要求,比如说需要更详细的日志,需要设置DEBUG级别或者为了减少日志输出,将日志级别设置为ERROR,默认的设置便不再适用,那么该怎样操作才能满足需要呢?
运行程序时指定日志级别
将项目打包,如打包成jar
运行程序设置参数,如下
# java -jar demo.jar --debug
在配置文件中追加日志级别
在application.properties文件中设置如下:
更改日志系统的的输出等级
debug=true
该属性设置为true时,日志会输出日志系统内部的日志级别为DEBUG的信息,但自定义的DEBUG日志不会输出,如上的程序重新执行的结果如下:
2019-04-19 14:48:07.579 INFO 3800 --- [nio-8080-exec-1] com.example.demo.controller.Hello : 默认info级别
2019-04-19 14:48:07.579 WARN 3800 --- [nio-8080-exec-1] com.example.demo.controller.Hello : 默认warn级别
2019-04-19 14:48:07.579 ERROR 3800 --- [nio-8080-exec-1] com.example.demo.controller.Hello : 默认error级别
2019-04-19 14:48:07.599 DEBUG 3800 --- [nio-8080-exec-1] m.m.a.RequestResponseBodyMethodProcessor : Using 'text/html', given [text/html, application/xhtml+xml, image/webp, image/apng, application/xml;q=0.9, */*;q=0.8] and supported [text/plain, */*, text/plain, */*, application/json, application/*+json, application/json, application/*+json]
2019-04-19 14:48:07.600 DEBUG 3800 --- [nio-8080-exec-1] m.m.a.RequestResponseBodyMethodProcessor : Writing ["Hello World"]
2019-04-19 14:48:07.609 DEBUG 3800 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed 200 OK
因此这种设置仅仅针对日志系统,无法更改自定义日志级别。
更改自定义日志输出级别
logging.level.com=DEBUG
该配置表示com包下的日志输出等级为DEBUG,如果同时配置如下,则以外包的配置为准
logging.level.com=DEBUG
logging.level.com.example=ERROR
经测试,自定义输出日志级别为DEBUG。
配置日志文件
在application.properties默认配置文件中配置如下:
logging.file=F://logs/demo.log
Spring Boot 数据库交互
配置数据库
参数配置连接数据库
在application.properties文件中配置如下:
#配置数据库
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@127.0.0.1:1521:XE
spring.datasource.username=demo
spring.datasource.password=demo
#Hikari连接配置
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=select 1 from dual
#Hibernate方言配置
spring.jpa.database-platform=org.hibernate.dialect.OracleDialect
我使用的是默认连接池Hikari,无需添加额外的依赖配置,直接配置即可,由于连接的数据库是Oracle,Oracle是收费的,导致Oracle的驱动包无法在中央仓库中获取,需要进行本地依赖的配置。
数据操作
JPA(Hibernate)配置
在pom文件中引入如下依赖配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
创建实体类
package com.example.demo.entity;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "DEMO_USER")
public class DemoUser {
@Id
@Column(name = "ID", length = 10, nullable = false)
private Integer id;
@Column(name = "NAME", length = 40, nullable = false)
private String name;
@Column(name = "SEX", length = 1, nullable = true)
private String sex;
@Column(name = "CREATEDATE", nullable = false)
private Date createDate;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
@Override
public String toString() {
return "DemoUser [id=" + id + ", name=" + name + ", sex=" + sex + ", createDate=" + createDate + "]";
}
}
创建Dao层接口
对于一些简单的操作,比如对单表的增删改查,可以直接继承JpaRepository类,可以重写或者直接使用父类方法
package com.example.demo.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import com.example.demo.entity.DemoUser;
public interface DemoUserDao extends JpaRepository<DemoUser, Integer> {
}
测试使用接口操作数据库
package com.example.demo.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.dao.DemoUserDao;
import com.example.demo.entity.DemoUser;
@RestController
public class TestDemoUserController {
@Autowired
private DemoUserDao demoUserDao;
@RequestMapping("/testDemoUser")
public void test(){
System.out.println("开始查询表DEMO_USER的所有结果");
List<DemoUser> userDaos = demoUserDao.findAll();
for (DemoUser demoUser : userDaos) {
System.out.println(demoUser.toString());
}
}
}
测试结果如下:
DemoUser [id=2, name=李四, sex=0, createDate=2019-04-25 11:57:22.0]
DemoUser [id=1, name=张三, sex=1, createDate=2019-04-25 12:01:51.0]
DemoUser [id=3, name=王五, sex=0, createDate=2019-04-25 12:03:00.0]