基础项目构建
Spring Boot开启的2种方式
继承spring-boot-starter-parent项目 导入spring-boot-dependencies项目依赖
注意点:
属性覆盖只对继承有效:Spring Boot依赖包里面的组件的版本都是和当前Spring Boot绑定的,如果要修改里面组件的版本,只需要添加如下属性覆盖即可 ,但这种方式只对继承有效,导入的方式无效。 如果导入的方式要实现版本的升级,达到上面的效果,这样也可以做到,把要升级的组件依赖放到Spring Boot之前 。需要注意,要修改Spring Boot的依赖组件版本可能会造成不兼容的问题。
运行Spring Boot的3种方式
运行启动类的main方法。 使用spring-boot:run命令。 打成jar包后使用java -jar xx.jar命令。(???没有主清单属性???)
核心配置文件
在 Spring Boot 中有以下两种配置文件:
bootstrap (.yml 或者 .properties):是应用程序的父上下文,由父 ApplicationContext 加载,比 applicaton 优先加载 。 主要用于从额外的资源来加载配置信息。它们默认也不能被本地相同配置覆盖 。 application (.yml 或者 .properties):主要用于 Spring Boot 项目的自动化配置。
备注:在命令行运行时,连续的两个减号–就是对application.properties中的属性值进行赋值的标识。所以,java -jar xxx.jar --server.port=8888命令,等价于我们在application.properties中添加属性server.port=8888 *.properties文件是key=value的形式 *.yml是key: value的形式
多环境配置
在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。方法:
针对各环境新建不同的配置文件application-dev.properties、application-test.properties、application-prod.properties(备注:这是命名约定的格式:application-{profile}.properties) application.properties中设置spring.profiles.active=dev,就是说默认以dev环境设置 更高级的用法:借助@Profile(“xxx”),xxx譬如为dev
@Profile注解使用范围:@Configration 和 @Component 注解的类及其方法,其中包括继承了@Component的注解:@Service、@Controller、@Repository等… @Profile可接受一个或者多个参数,例如: @Profile 注解还可以取反,如下所示:
查看自动配置报告
SpringBoot自动配置的实现原理 、阿里微服务专家手写Spring Boot 实现一个简单的自动配置模块 ???不起作用????被@ConfigurationProperties注解的文件,提示spring boot Configuration Annotation Processor not found in classpath???? 怎么查看自己加的自动配置类有没有被加载,或者查看所有自动配置激活的和未激活的可以通过以下几种试查看。
mvn spring-boot:run运行的在对话框Enviroment中加入debug=true变量 java -jar xx.jar --debug main方法运行,在VM Argumanets加入-Ddebug 直接在application文件中加入debug=true 控制台看到的自动配置报告信息:
Positive matches:已经启用的自动配置 Negative matches:未启用的自动配置
Spring Boot 2.x 启动全过程
小例子
Spring Boot 主类及目录结构
打成可执行 jar 包后,我们来看下其中的 META-INF/MANIFEST.MF 文件。
Spring Boot Starters启动器
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术。Spring Boot官方的启动器都是以spring-boot-starter-命名的
为什么@SpringBootApplication exclude DataSourceAutoConfiguration.class
因为它会读取application.properties文件的spring.datasource.*属性并自动配置单数据源。
Spring Boot 最核心的 几 个注解
@Configuration 这是 Spring 3.0 添加的一个注解,用来代替 applicationContext.xml 配置文件,所有这个配置文件里面能做到的事情都可以通过这个注解所在类来进行注册。@Bean 用来代替 XML 配置文件里面的 <bean …> 配置。 @ImportResource 如果有些通过类的注册方式配置不了的,可以通过这个注解引入额外的 XML 配置文件,对于有些老的配置文件无法通过 @Configuration 方式配置的非常管用。 @Import 用来引入额外的一个或者多个 @Configuration 修饰的配置文件类。 @SpringBootConfiguration 这个注解就是 @Configuration 注解的变体,只是用来修饰是 Spring Boot 配置而已,或者可利于 Spring Boot 后续的扩展。 @ComponentScan 这是 Spring 3.1 添加的一个注解,用来代替配置文件中的 component-scan 配置,开启组件扫描,即自动扫描包路径下的 @Component 注解进行注册 bean 实例到 context 中。另外,@ComponentScans 是可重复注解,即可以配置多个,用来配置注册不同的子包。@EnableAutoConfiguration 这是自 Spring Boot 诞生时添加的注解,用来提供自动配置。主要作用就是调用 Spring-Core 包里的 loadFactoryNames(),将 org.springframework.boot.autoconfigure包里的已经写好的自动配置spring.factories 加载进来。
Runner启动器
如果你想在Spring Boot启动的时候运行一些特定的代码,你可以实现接口 ApplicationRunner或者 CommandLineRunner,样例 如果启动的时候有多个ApplicationRunner和CommandLineRunner,想控制它们的启动顺序
读取配置文件的几种方式
@Value注解读取方式 @ConfigurationProperties注解读取方式 读取非默认的配置文件,需要加上@PropertySource
@PropertySource+@Value,下图有例 @PropertySource+@ConfigurationProperties Environment读取方式:以上所有加载出来的配置都可以通过Environment注入获取到
优先级从高到低
命令行指定的参数,如 java -jar springboot.jar --name="xxxx”
; 操作系统环境变量参数 JAR包外面的配置文件参数(application-{profile}.properties(YAML)
) JAR包里面的配置文件参数(application-{profile}.properties(YAML)
) JAR包外面的配置文件参数(application.properties(YAML)
) JAR包里面的配置文件参数(application.properties(YAML)
) @Configuration
配置文件上 @PropertySource
注解加载的参数
Spring Boot Server容器配置
server.xx开头的是所有servlet容器通用的配置(譬如server.port),server.tomcat.xx开头的是tomcat特有的参数,其它类似。 所有参数绑定配置类:org.springframework.boot.autoconfigure.web.ServerProperties spring-boot-starter-web自动携带了tomcat依赖,但也可以替换成jetty和undertow,下面是一个替换jetty的示例。
热部署
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
# 热部署开关,false即不启用热部署
spring.devtools.restart.enabled=true
# 指定热部署的目录
spring.devtools.restart.additional-paths=src/main/java
# 指定目录不更新
spring.devtools.restart.exclude=test
3、Intellij Idea修改:
(1)勾上自动编译或者手动重新编译:File > Settings > Compiler>Build Project automatically (2)注册:ctrl + shift + alt + / > Registry > 勾选compiler.automake.allow.when.app.running 注意:
1、生产环境devtools将被禁用,如java -jar方式或者自定义的类加载器等都会识别为生产环境。 2、打包应用默认不会包含devtools,除非你禁用SpringBoot Maven插件的 excludeDevtools属性。
Spring Boot 发布 jar 包转为 war 包
Spring Boot是支持发布jar包和war的,但它推荐的是使用jar形式发布,附录:如何配置打war包 备注:jar包与war包区别
jar包就是class文件和一些resource的压缩包 war包是一个web模块,其中需要包括WEB-INF,是可以直接运行的WEB模块,直接放到tomcat的webapps目录下,直接启动tomcat即可,这个包可以自动进行解压,也就是你的web目录,相当于发布了。war包根目录下一般包含有Html和Jsp文件或者包含这两种文件的目录,另外还会有一个WEB-INF目录,这个目录很重要。通常在WEB-INF目录下有一个web.xml文件和一个classes目录,web.xml是这个应用的配置文件,而classes目录下则包含编译好的Servlet类和Jsp或Servlet所依赖的其它类(如JavaBean)。通常这些所依赖的类也可以打包成JAR放到WEB-INF下的lib目录下。
spring boot 日志
spring-boot-starter启动器包含spring-boot-starter-logging启动器并集成了slf4j日志抽象(日志门面)及Logback日志框架。如果你使用starters启动器,Spring Boot将使用Logback作为默认日志框架。无论使用哪种日志框架,Spring Boot都支持配置将日志输出到控制台或者文件中。 目前关于日志输出,主要有两类工具:一类是日志框架,主要用来进行日志输出的,比如输出到哪个文件,日志格式等。另一类是日志门面,主要一套通用API,用来屏蔽各个日志框架之间的差异的。所以,请不要在代码中出现任何Log4j等日志框架的API的使用,而是应该直接使用SLF4J(simple logging facade for java)这种日志门面。 往resources资源目录下创建一个logback-spring.xml即可。强烈推荐使用logback-spring.xml作为文件名(日志框架就不能直接加载日志的配置项,由SpringBoot解析日志配置。可以使用SpirngBoot的高级Profile功能),因为logback.xml加载太早(直接就被日志框架识别)。
在Spring Boot中,Controller和Service是默认是单例。如果你不小心,这会引入可能的并发问题。 Spring Boot 2.x 至少需要 JDK 8 的支持。
你自己写的其他读书笔记