概述
介绍
随着动态语言的流行(Ruby、Groovy、Scala、Node.js),Java 的开发运行格外的笨重:繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术集成难度大。
在上述环境下,SpringBoot应运而生。它使用"习惯优于配置"(项目中存在大量的配置, 此外还内置一个习惯性的配置,让你无须手动进行配置)的理念让你的项目快速运行起来。使用SpringBoot很容易创建一个独立运行(运行jar,内联Servlet容器)、准生产级别的基于Spring框架的项目,使用 SpringBoot你可以不用或者只需要很少的 Spring配置。
核心功能
- 独立运行的Spring项目
SpringBoot可以以jar包的形式独立运行,运行一个SpringBoot项目只需通过java -jar xx.jar来运行。 - 内嵌Servlet容器
SpringBoot可选择内嵌Tomcat、Jetty或者Undertow,这样我们无须以war包形式部署项目。 - 提供starter简化Maven配置
Spring提供了一系列的starter pom来简化Maven的依赖加载。 - 自动配置Spring
SpringBoot会根据在类路径中的jar包、类,为jar包里的类自动配置Bean,这样会极大地减少我们要使用的配置,当然,SpringBoot只是考虑了大多数的开发场景,并不是所有的场景,若在实际开发中我们需要自动配置Bean,而SpringBoot 没有提供支持,则可以自定义自动配置。 - 准生产的应用监控
SpringBoot提供基于http、ssh、telnet对运行时的项目进行监控。 - 无代码生成和xml 配罝
SpringBoot的神奇不是借助于代码生成来实现的。而是通过条件注解来实现的。
快速搭建
单模块搭建
点击file->new->project,选择Spring Initializr然后点击下一步,如果失败,则选择Custom,填入阿里初始化地址 https://start.aliyun.com/。
填写项目信息,GroupId一般分为多个段,第一段为域,第二段为公司名称。域又分为org、com、cn等等许多,其中org为非营利组织,com为商业组织。ArtifactId表示你这个项目的名称,然后点击next。
选择项目的依赖,也可以后续在pom文件中添加(这里我选择了spring web 和 mybatis的依赖),点击下一步,选择项目位置,点击完成,我们的项目就搭建好了。
多模块搭建
父模块搭建和上面步骤一样,不过在选择项目类型为Maven Pom
点击父模块右击Module,创建子模块
模块配置
–父模块:
–子模块:
基础使用
入口类
SpringBoot通常有一个名为xxApplication的入口类,入口类里有一个main方法,这个main 方法其实就是一个标准的Java 应用的入口方法。在main方法中使用 SpringApplication.run(BasisApplication.class, args),启动SpringBoot应用项目。
@SpringBootApplication是SpringBoot的核心注解,它是一个组合注解,源码如下:
如果不使用@SpringBootApplication,则可以在入口类上面直接使用@EnableAutoConfiguration、@Configuration、@ComponentScan
- @EnableAutoConfiguration:让 SpringBoot根据类路径中的jar包依赖为当前项目进 行自动配置。
- @Configuration:声明一个类为配置类,用于取代bean.xml配置文件注册bean对象。
- @ComponentScan:根据定义的扫描路径,把符合扫描规则的类装配到spring容器中。
关闭特定的自动配置
根据@SpringBootApplication源码我们可知,关闭特定的自动配置可以使用@SpringBootApplication的exclude参数。
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
定制Banner
- 修改Banner
在src/main/resource下新建一个banner.txt,通过网站生成字符并复制到文件中。 - 关闭banner
- 方法1:修改main入口类
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(BasisApplication.class);
springApplication.setBannerMode(Banner.Mode.OFF);
springApplication.run(args);
}
- 方法2:Edit Configurations,修改配置
项目配置
yaml配置
SpringBoot使用一个全局的配置文件application.properties或application.yml,放置在 sre/main/resources目录或者类路径的/config下。
SpringBoot不仅支持常规的properties配置文件,还支持yaml语言的配置文件。yaml是以数据为中心的语言,在配罝数据的时候具有面向对象的特征。SpringBoot的全局配置文件的作用是对一些默认配置的配置值进行修改。简单配置如下:
server:
port: 8080
servlet:
context-path: /basis
命令行参数配置
SpringBoot可以是基于jar包运行的,打成jar包的程序可以直接通过下面命令运行(修改端口为9090):
java -jar xx.jar --server.port=9090
@PropertySource和@Value
组合使用,可以将自定义属性文件中的属性变量值注入到当前类的使用@Value注解的成员变量中。
#persion配置类
persion.name=张三
persion.age=12
@Component
@PropertySource(value = "classpath:config/persion.properties", ignoreResourceNotFound = true, encoding = "utf-8")
public class PersonPropertis {
@Value("${persion.name}")
private String name;
@Value("${persion.age}")
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "PersonPropertis{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
@ConfigurationProperties
一般和@PropertySource组合使用,否则读取默认配置文件(application.properties),可以将属性文件与一个Java类绑定,将属性文件中的变量值注入到该Java类的成员变量中。
#student配置类
student.name=张三
student.age=12
@Component
@PropertySource(value = "classpath:student.properties", ignoreResourceNotFound = true, encoding = "utf-8")
@ConfigurationProperties(prefix = "student")
public class StudentPropertis {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "StudentPropertis{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
//用法2(推荐)
@Configuration
@PropertySource(value = "classpath:config/student.properties", ignoreResourceNotFound = true, encoding = "utf-8")
public class StudentConfig {
@Bean
@ConfigurationProperties(prefix = "student")
public StudentPropertis studentPropertis(){
return new StudentPropertis();
}
}
日志配置
默认情况下,SpringBoot会用Logback来记录日志,并用INFO级别输出到控制台。在运行应用程序时,可以看到很多INFO级别的日志了。
默认日志输出内容元素具体如下:
- 时间日期:精确到毫秒
- 日志级别:ERROR, WARN, INFO, DEBUG or TRACE
- 进程ID
- 分隔符:—前面几个内容和实际日志的分割
- 线程名:方括号括起来([ main])
- Logger名:通常使用源代码的类名
- 日志内容
yaml方式配置
# 日志配置
logging:
# 日志级别
level:
root: info
file:
# 日志文件名格式
name: ./logs/${spring.application.name}.log
pattern:
# 一般使用默认格式就行,无需配置
# 日志记录格式[组件名称] [时间戳] [日志级别] [类名.方法名] [消息文本]
file: "%d{yyyy-MM-dd HH:mm:ss.SSS} %p %C.%M %m %n"
logback:
rollingpolicy:
# 根据文件大小归档,超过2KB自动归档,次日启动服务时也会自动归档
file-name-pattern: ./logs/%d{yyyyMMdd}/${spring.application.name}.%d{yyyy-MM-dd}_%i.log.gz
# 最大日志文件大小(默认为10MB,这里为了测试归档,暂时设置为2KB,具体视情况修改)
max-file-size: 2KB
# 要保留的日志备份的总大小(默认为0B)
total-size-cap: 1GB
# 保存存档日志文件的最大天数(默认为7天)
max-history: 20
自定义配置
# application-dev.yml日志配置
log:
# 日志级别
level:
root: info
com:
fengfan:
basis: debug
file:
path: ./log
maxHistory: 20
maxFileSize: 2KB
totalSizeCap: 1GB
pattern: "%d{yyyy-MM-dd HH:mm:ss.SSS} %p %C.%M %m %n"
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--
说明:
1. 文件的命名和加载顺序有关
logback.xml早于application.yml加载,logback-spring.xml晚于application.yml加载
如果logback配置需要使用application.yml中的属性,需要命名为logback-spring.xml
2. logback使用application.yml中的属性
使用springProperty才可使用application.yml中的值 可以设置默认值
-->
<springProperty scope="context" name="LOG_HOME" source="log.file.path" defaultValue="./log"/>
<springProperty scope="context" name="APP_NAME" source="spring.application.name" defaultValue="basis"/>
<!-- 日志输出级别 -->
<springProperty scope="context" name="ROOT_LEVEL" source="log.level.root" defaultValue="INFO"/>
<springProperty scope="context" name="BASIS_LEVEL" source="log.level.com.fengfan.basis" defaultValue="DEBUG"/>
<springProperty scope="context" name="PATTERN" source="log.file.pattern" defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS} - [%X{traceID}] - [%thread] %-5level %logger{50}.%M\(%line\) - %msg%n"/>
<!--日志保留天数-->
<springProperty scope="context" name="MAXHISTORY" source="log.file.maxHistory" defaultValue="30"/>
<!--单个日志文件最大容量-->
<springProperty scope="context" name="MAXFILESIZE" source="log.file.maxFileSize" defaultValue="100MB"/>
<!--日志文件总量-->
<springProperty scope="context" name="TOTALSIZECAP" source="log.file.totalSizeCap" defaultValue="10GB"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%message:日志消息,%n是换行符-->
<pattern>${PATTERN}</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/${APP_NAME}.%d{yyyy-MM-dd}_%i.log.gz</fileNamePattern>
<!--日志文件保留天数-->
<maxHistory>${MAXHISTORY}</maxHistory>
<maxFileSize>${MAXFILESIZE}</maxFileSize>
<totalSizeCap>${TOTALSIZECAP}</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%message:日志消息,%n是换行符 -->
<pattern>${PATTERN}</pattern>
</encoder>
</appender>
<!--打印完整SQL日志,需要配置为debug日志级别-->
<logger name="com.apache.ibatis"/>
<logger name="java.sql.Connection"/>
<logger name="java.sql.Statement"/>
<logger name="java.sql.PreparedStatement"/>
<!--本地开发环境-->
<springProfile name="dev">
<root level="${ROOT_LEVEL}">
<appender-ref ref="FILE"/>
<appender-ref ref="STDOUT"/>
</root>
<logger name="com.fengfan.basis" level="${CN_LEVEL}"/>
</springProfile>
<!-- 生产环境 -->
<!-- <springProfile name="prod">-->
<!-- <root level="${ROOT_LEVEL}">-->
<!-- <appender-ref ref="STDOUT"/>-->
<!-- <appender-ref ref="FILE"/>-->
<!-- </root>-->
<!-- <logger name="com.fengfan.basis" level="${CN_LEVEL}"/>-->
<!-- </springProfile>-->
<!-- 日志输出级别 -->
<root level="${ROOT_LEVEL}">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
<logger name="com.fengfan.basis" level="${CN_LEVEL}"/>
</configuration>
具体使用请参见logback官网https://logback.qos.ch/
profile配置
Spring对不同环境,提供不同配置功能的支持,可以通过激活、指定参数等方式快速的切换环境,环境就是平常的开发环境、测试环境、生产环境等。
spring:
application:
name: basis
profiles:
active: dev
xml使用配置
SpringBoot提倡零配置,即无xml配置,但是在实际项目中,可能有一些特殊要求你必须使用xml配置,这时我们可以通过Spring提供的@ImportResource来加载xml配置,如下:
@ImportResource("classpath:config/spring.xml")
打包部署
- 在web子模块中添加打包插件
- 执行打包命令需要忽略执行test,不然就会报错。使用命令mvn package -Dmaven.test.skip=true 或者 mvn package -DskipTests=true来忽略。