一、入门
1、编写基本的SpringBoot项目
1、创建maven工程
2、导入依赖
3、编写主程序
/**
* 表明这是一个SpringBoot的主程序类
*/
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
// Spring应用启动起来
SpringApplication.run(MainApplication.class, args);
}
}
2、HelloWorld探究
1、POM文件
1、父项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
它的父项目是spring-boot-dependecies:来真正管理springboot应用的所有依赖版本
有一个<propertes>定义了每一个依赖的版本
SpringBoot的版本仲裁中心
以后导入依赖默认是不需要写版本;dependecies中没引入的需要声明版本号
2、场景启动器
spring-boot-stater-web
spring-boot-stater:
SpringBoot场景启动器,声明了一些依赖导入,导入web模板正常运行需要依赖的组件
SpringBoot将所有的功能场景都抽取处理啊,做成一个个的starters(启动器),只需要在项目里引入这些相关场景的依赖。版本由父pom自动控制,一个功能对应一个场景启动器
2、主程序类
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
// Spring应用启动起来
SpringApplication.run(MainApplication.class, args);
}
}
@SpringBootApplication
标注的类是SpringBoot的主配置类,运行该类main方法来启动应用
@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 {
1、@SpringBootConfiguration:表示是SpringBoot的配置类,底层是@Configuration配置类=配置文件,配置类也是容器中的一个组件
2、@EnableAutoConfiguration:开启自动配置功能。是一个组合注解
@AutoConfigurationPackage
@Import({
AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
1、@AutoConfigurationPackage:自动配置包。
将主配置类的所在包及下面所有子包里面的所有组件扫描到Spring容器中
2、@Import({AutoConfigurationImportSelector.class}):给容器中导入一个组件;导入的组件由**AutoConfigurationImportSelector.class**(导入组件的选择器)指定。
**AutoConfigurationImportSelector.class**该类下的String[] selectImports()方法,将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中。会给容器中导入非常多的自动配置类(xxxAutoConfiguration)
todo 截图自动配置类内容
AutoConfigurationImportSelector.getCandidateConfigurations()方法
-> SpringFactoriesLoader.loadFactoryNames():从"META-INF/spring.factories"路径下,spring-boot-autoconfiguration包下的META-INF/spring.factories文件里面定义的org.springframework.boot.autoconfigure.EnableAutoConfiguration字段定义的配置类,导入到容器中,自动配置类就生效
3、使用Spring Initializer快速创建项目
选中自己需要的模块,联网自动下载依赖
默认生成的内容:
- 主程序已经生成好,无需手动编写Application类
- resources文件夹。
- static:保存所有静态资源:imags…
- templates:保存所有模板页面,默认jar包方式,嵌入式Tomcat,默认不支持jsp页面,可以使用模板引擎(freemarker、thymeleaf)
- application.properties:Spring Boot应用的配置文件。可修改一些默认设置,ex:server.port=XXX
二、配置文件
1、配置文件
SpringBoot使用一个全局的配置文件
- application.properties
- application.yml
作用:修改自动配置的默认值
YAML(YAML Ain’t Markup Language):以数据为中心的配置
- a:是一个标记语言
- isn’t:不是一个标记语言
标记语言:
yml配置案例
server:
port: 8090
2、YAML语法
1、基本语法
K: [空格]V 表示一个键值对
以空格缩进来控制层级关系,左对齐的一列数据是同一层级
属性和值也是大小写敏感
2、值的写法
字面量:普通的值(数字、字符串、布尔)
- k: v:字面量直接写、字符串默认不用加引号
- “”:不转义字符串中特殊字符
- ‘’:会转义特殊字符
对象:属性+值,键值对
- k: v:下一行写对象的属性和值
friends:
lastName:zhangsan
age:20
-
行内写法
friends: {lastName:zhangsan, age: 18}
数组:
用-值表示数组中的一个元素
pets:
- cat
- dog
- pig
pets: [cat,dog,pig]
3、获取配置文件值
1、将配置文件中配置的属性值映射到组件中@ConfigurationProperties(prefix = "xxx")
:将本类中的所有属性和配置文件中值进行绑定
2、导入配置文件处理器
spring-boot-configuration-processor
单元测试
@SpringBootTest:使用SpringBoot的单元测试
@RunWith(SpringRunner.class) :驱动器
3、properties配置文件
1、语法
2、获取配置文件值
1、@ConfigurationProperties(prefix = “xxx”);编码问题:FileEncodings:设置转换成ASCII
2、@Value:Spring的底层注解,为字段赋值。@Value(${xxx.yyy}/表达式/字面量)
获取map的值:
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 导入一个类的属性定义 | 单个字段的导入 |
松散绑定 | last-name=lastName | 不支持 |
spEl | 不支持 | 支持 |
复杂类型封装 | 支持 | 不支持 |
JavaBean和配置文件进行映射时->@ConfigurationProperties
单个字段获取配置值->@Value
三、Profile
用来支持多环境配置
1、多Profile文件
1、properties文件
主配置文件编写时,文件名可为application-{profile}.properties/yaml
2、yaml文件
—:同一个文件中划分不同的document
2、激活指定profile
- Spring-profiles.active = xxx:配置文件中指明激活指定profile
- 命令行:idea运行时指定。–spring.profiles.active = dev。优先级更高
- 将项目打成jar包(打完的包在target目录下),java -jar xxx.jar --spring.profiles.active = dev
- 虚拟机参数。VM options:-Dspring-profiles.active=dev
四、日志
1、日志框架
JUL、JCL、JBoss-logging、logback、log4j、log4j2、slf4j…
日志门面(抽象层) | 日志实现 |
---|---|
Log4j、 |
左边选一个门面,右边选一个实现
日志门店:slf4j;实现:log4j2
SpringBoot底层是Spring框架,Spring默认是JCL、SpringBoot选用的是slf4j和logback
2、SLF4J使用
导入slf4jjar报和logback的实现jar
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
每个日志的实现框架都有自己的配置文件,使用slf4j之后,配置文件还是做成日志实现框架的配置文件;
如何让系统中所有日志都统一到slf4j:有转换jar(A-over-B.jar)包可以导入
1、将系统中自带的日志框架排除出去
2、用中间包替换原有的日志框架
3、导入实际使用的slf4j的实现包
3、SpringBoot日志关系
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
SpringBoot中spring-boot-start-logging 底层导入了多种XX-over-slf4j的包,底层导入了日志抽象层slf4j,将其他日志转为了slf4j、使用logback实现记录日志
如果要引入其他框架,一定要把这个框架的默认日志依赖移除掉
SpringBoot能自动适配所有的日志,底层使用的是slf4j-logback的方式记录日志,引入其他框架时需要将日志依赖排除掉。默认已经配置好日志了,可以直接使用。
/**
* 生成一个记录器。LoggerFactory记录器工厂,日志级别:由低到高
*/
Logger logger = LoggerFactory.getLogger(getClass());
// 跟踪信息
logger.trace();
// 调试信息,调试关键点的输出
logger.debug();
// SpringBoot默认使用的是info及以上的级别
// 常用的信息输出
logger.info();
// 警告
logger.warn();
// 错误日志
logger.error();
logging.file=XXX // 不指定路径在当前项目下生成
logging.path=YYY
spring.log是不指定file时默认的日志文件名
日志输出格式
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %t %-5level %logger{30}.%method - %msg%n" />