Spring Boot 系列(一)快速入门
简介
- Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者的。
Spring Boot 具有如下特性
- 为基于 Spring 的开发提供更快的入门体验
- 开箱即用,没有代码生成,也无需 XML 配置。同时也可以修改默认值来满足特定的需求。
- 提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等。
- Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速使用 Spring 的方式。
配置工具
1、JDK1.8
2、Maven(也可以使用非maven工具搭建)
3、IDE(Eclipse、IntelliJ 或者其它的)
一、构建简单spring boot 项目
这里官网提供的生成器SPRING INITIALIZR 来创建简单的spring boot 项目。
1. 访问 http://start.spring.io
选项: 工程(maven) 语言(java) SpringBoot版本(2.0.3)
Group填组名,Artifact填模块名,右侧Dependencies 可以选择相应的依赖,因为我们要构建web项目,所以可以添加web的依赖。
点击 Generate Project 生成下载项目。
2.使用IDEA创建项目(这里使用IntelliJ IDEA)
FILE > New > Project > 选择 Spring Initializr 然后直接下一步,完成默认创建
勾选web 和 DevTools > 点击finsh完成创建
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>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<!--起步依赖-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--web项目相关依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</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>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 没有该配置,devtools 不生效 -->
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
</project>
3.创建controller
新建controller包,包下新建HelloController
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@RequestMapping("/hello")
@ResponseBody
public String hello() {
return "hello world";
}
}
4.程序自动创建了 DemoApplication 会有一个@SpringBootApplication的注解,这个注解用来标明这个类是程序的入口
@SpringBootApplication开启了Spring的组件扫描和springboot的自动配置功能,相当于将以下三个注解组合在了一起
(1)@Configuration:表名该类使用基于Java的配置,将此类作为配置类
(2)@ComponentScan:启用注解扫描
(3)@EnableAutoConfiguration:开启springboot的自动配置功能
运行DemoApplication.java 启动项目,启动日志可以看到端口为8080
打开浏览器访问:http://localhost:8080/hello 可得结果。
说明项目运行方式:
- 在idea中,直接运行DemoApplication.java 文件。
- 把项目通过maven命令 mvn package 打成jar包,通过命令 java -jar demo-0.0.1-SNAPSHOT.jar 直接执行jar包
- 借助maven插件,执行mvn spring-boot:run 即可运行项目。
5.加载配置文件application.yml(我们这里是有yml配置,不使用传统的properties配置)
# Tomcat
server:
tomcat:
uri-encoding: UTF-8
max-threads: 1000
min-spare-threads: 30
port: 8080
6.配置日志
6.1 配置 logback(官方推荐使用)
6.2 配置日志文件
spring boot 默认会加载 classpath:logback-spring.xml 或者 classpath:logback.xml。
如需要自定义文件名称,在 application.yml中配置 logging.config 选项即可。
在 src/main/resources 下创建 logback.xml 文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<property name="project_Name" value="boot-api" />
<property name="logPath" value="logs" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %-5level [%thread] %logger{35} - %msg %n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 全部日志 -->
<appender name="ROLLING_ALL"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logPath}/all/all.log</file>
<!-- 每天滚动 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logPath}/all/all-%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<!-- 保存90天 -->
<maxHistory>90</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 按日期和文件大小滚动,每个文件100MB -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %-5level [%thread] %logger{35} - %msg %n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- WARN级别日志 -->
<appender name="ROLLING_WARN"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logPath}/warn/warn.log</file>
<!-- 每天滚动 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logPath}/warn/warn-%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<!-- 保存90天 -->
<maxHistory>90</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 按日期和文件大小滚动,每个文件100MB -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %-5level [%thread] %logger{35} - %msg %n</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- ERROR级别日志 -->
<appender name="ROLLING_ERROR"
class="ch.qos.logback.core.rolling.RollingFileAppender" level="ERROR">
<file>${logPath}/error/error.log</file>
<!-- 每天滚动 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logPath}/error/error-%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<!-- 保存90天 -->
<maxHistory>90</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 按日期和文件大小滚动,每个文件100MB -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %-5level [%thread] %logger{35} - %msg %n</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="ROLLING_ALL" />
<appender-ref ref="ROLLING_WARN" />
<appender-ref ref="ROLLING_ERROR" />
</root>
</configuration>
7.打包运行
打包的形式有两种:jar 和 war。由pom的packaging来控制
7.1默认情况下,通过 maven 执行 package 命令后,会生成 jar 包,且该 jar 包会内置了 tomcat 容器,因此我们可以通过 java -jar 就可以运行项目
7.2 打war包
让 DemoApplication类继承 SpringBootServletInitializer 并重写 configure 方法,如下:
修改 pom.xml 文件,将 jar 改成 war,如下:
打包成功后,将 war 包部署到 tomcat 容器中运行即可。
官方文档 https://docs.spring.io/spring-boot/docs/1.5.8.RELEASE/reference/html/