1Spring Boot 概述
理念:习惯优于配置,提升开发效率
核心功能:
- 内嵌Servlet容器,可以以jar包方式独立运行
- 提供start简化maven配置
- 自动配置Spring模块
- 运行时应用监控
2Spring环境搭建
maven配置:
<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>
</parent>
<groupId>com.study.spring</groupId>
<artifactId>springboot2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springboot2</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 移除嵌入式tomcat插件 -->
<!-- <exclusions> <exclusion> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> -->
</dependency>
</dependencies>
</project>
样例程序:
package com.study.spring.springboot2.hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Spring Boot开始程序
* @author chaozai
* @date 2018年9月5日
*
*/
@SpringBootApplication
@RestController
public class HelloApp {
/**
*
* @return
*/
@GetMapping("/hello")
public String hello(){
return "hello spring boot";
}
public static void main(String[] args) {
SpringApplication.run(HelloApp.class, args);
}
}
结果:
3基本配置
3.1启动类和@SpringBootApplication
启动方式:SpringApplication.run(HelloApp.class, args);
@SpringBootApplication源码:
核心注解,包含:@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan
/*** Eclipse Class Decompiler plugin, copyright (c) 2016 Chen Chao (cnfree2000@hotmail.com) ***/
package org.springframework.boot.autoconfigure;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigurationExcludeFilter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.TypeExcludeFilter;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.core.annotation.AliasFor;
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = { TypeExcludeFilter.class }),
@Filter(type = FilterType.CUSTOM, classes = { AutoConfigurationExcludeFilter.class }) })
public @interface SpringBootApplication {
@AliasFor(annotation = EnableAutoConfiguration.class)
Class<?>[] exclude() default {};
@AliasFor(annotation = EnableAutoConfiguration.class)
String[] excludeName() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanBasePackages() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
Class<?>[] scanBasePackageClasses() default {};
}
3.2自动配置
@EnableAutoConfiguration
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({ AutoConfigurationImportSelector.class })
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
关闭特定的自动配置,通过exclude,如:
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
3.3定制Banner
/src/main/resources下创建banner.txt
效果:
3.4配置文件:application.properties(yml)
配置端口和context-path
src/main/resources下创建application.properties
server.port=8000
server.servlet.contextPath=/study
效果:
配置属性:
self.author=chaozai
@Value使用
@Value("${self.author}")
private String author;
/**
*
* @return
*/
@GetMapping("/author")
public String author(){
return "author:"+author;
}
效果:
3.5starter 组件
Spring官方提供了许多starter模块,可以通过maven引入。
还有些第三方提供的组件,可以去GitHub上淘一淘
3.6使用额外XML配置
添加配置:
@ImportResource({"classpath:some-context.xml"})
3.7命令行配置
如:java -jar x.jar --server.port=9000
3.8属性文件注入
属性文件:src/main/resources/config/message.properties
文件编码:ISO-8859-1
warning.code=110
warning.msg=warning
配置类:
package com.study.spring.springboot2.hello.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
/**
*
* @author chaozai
* @date 2018年9月6日
*
*/
@Component
@ConfigurationProperties(prefix = "warning")
@PropertySource("classpath:/config/message.properties")
public class MessageWarningConfiguration {
private String msg;
private int code;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
}
访问Controller:
package com.study.spring.springboot2.hello.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.study.spring.springboot2.hello.config.MessageWarningConfiguration;
/**
*
* @author chaozai
* @date 2018年9月6日
*
*/
@RestController
public class MessageController {
@Autowired
MessageWarningConfiguration configuration;
/**
*
* @return
*/
@GetMapping("/warning")
public String warning(){
System.out.println(configuration.getCode()+":"+configuration.getMsg());
return configuration.getCode()+":"+configuration.getMsg();
}
}
结果:
3.9日志配置
默认使用日志框架:logback
配置:src/main/resources/logback-spring.xml
<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%日期%索引,新的日志仍然是sys.log -->
<!-- 2.如果日期没有发生变化,但是当前日志的文件大小超过1KB时,对当前日志进行分割 重命名 -->
<appender name="studylog"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${user.dir}/logs/studylog.log</File>
<!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 -->
<!-- TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
<!-- 文件名:log/sys.2017-12-05.0.log -->
<fileNamePattern>${catalina.base}/logs/studylog.%d.%i.log</fileNamePattern>
<!-- <fileNamePattern>E:/wptserver.%d.%i.log</fileNamePattern> -->
<!-- 每产生一个日志文件,该日志文件的保存期限为30天 -->
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- maxFileSize:这是活动文件的大小,默认值是10MB,本篇设置为1KB,只是为了演示 -->
<maxFileSize>10MB</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" />
<appender-ref ref="studylog" />
</root>
</configuration>
结果:工程路径下将产生logs/studylog.log文件
4.10Profile配置
全局profile使用application-{profile}.properties配置,通过在application.properties中设置spring.profiles.active=prod来指定活动的Profile。
application.properties:
spring.profiles.active=prod
application-prod.properties:
#####################server######################
server.port=80
server.servlet.contextPath=/
#####################self######################
self.author=chaozai
结果:
爱家人,爱生活,爱设计,爱编程,拥抱精彩人生!