SpringBoot基础系列一
SpringBoot基础知识概览
特性
核心理念:约定优于配置
特点:
1、 开箱即用,根据项目依赖自动配置
2、 功能强大的服务体系,如嵌入式服务、安全
3、 绝无代码生成,不用写.xml配置,用注解和java配置来完成
4、 完美融合第三方技术
SpringBoot注解
核心注解及其组成
一、 SpringBoot的核心注解
SpringBoot的核心注解是@SpringBootApplication,用来标识主配置类,才能启动项目
@SpringBootApplication是一个复合注解,Ctrl键进入之后可以看到它的多个组合注解
其中重点的注解是@SpringBootConfiguration和@EnableAutoConfiguration还有@ComponentScan
@SpringBotConfiguration
@SpringBootConfiguration注解包含一个注解@Configuration表示这是一个配置类(代替以前使用的配置文件)
@Configuration含义:
1、 表示该类是一个配置类
2、 加了这个注解的类会自动加入Spring容器内(Spring中使用的是@Component注解)
@EnnableAutoConfiguration
@EnableAutoConfiguration使SpringBoot可以自动配置(即约定优于配置)
@EnableAutoConfiguration注解中又包含了多个注解
其中重点的注解是@AutoConfigurationPackage和@Import({AutoConfigurationImportSelector.class})
@AutoConfigurationPackage自动将包装入到扫描器
实现过程:
因为@AutoConfigurationPackage注解中又又一个注解@Import(Register.calss)
进入到Register里面可以看到
这个函数就可以将@SpringBootApplication所在类的包及其子包纳入Spring容器
@Import({AutoConfigurationImportSelectot.class})可以引入三方依赖纳入到Spring容器(上面注解是将自己写的包纳入容器)
实现过程:
进入AutoConfigurationImportSelectot类中可以看到有一个函数selectImports,这个函数就是用来引入三方依赖 根据META-INF下面的spring.factories来装配第三方依赖
总结:
编写项目时,一般会对自己写的代码以及三方依赖 进行配置。但是spring boot可以自动进行配置:
1、 自己写的代码,spring boot通过@SpringBootConfiguration自动帮我们配置;
2、 三方依赖 通过spring-boot-autoconfigure-2.0.3.RELEASE.jar中的META-INF/spring.factories进行声明,然后通过@EnableAutoConfiguration开启使用即可
3、 如何自动装配(以研究org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration为例分析)
观察源码分析可知:
1、 有一个@Configuration表示这是一个配置类,可以自动放到SpringIoc容器中
2、 然后有@ConditionalOnProperties(HttpEncodingProperties.class),我们可以进入到这个class里面看到这里面将默认编码方式设置为UTF_8
我们可以用类开始声明的prefix+属性名在配置文件中修改
### 总结:
(1) 每一个XxAutoConfiguration 都有很多条件@ConditionalOnXxx,当这些条件都满足时,则此配置自动装配生效
但是我们可以手工修改改 自动装配: XxxProperties文件中的prefix.属性名=value
(2) 如何知道spring boot开启了哪些自动装配、禁止了哪些自动装配: 在application.properties中添加 debug=true
Positive matches列表 表示 spring boot自动开启的装配
Negative matches列表 表示spring boot在此时 并没有启用的自动装配。
配置文件
1、 SpringBoot有哪几种配置文件?有什么区别
配置文件按照应用特性分可分为application文件和bootstrap文件两种
这两个文件又分别有.yml和.properties两种格式
appication和bootstrap区别
application文件主要用于SpringBoot项目的自动化配置
bootscrap文件的特性是由父ApplicationContext加载,优先于application加载,且当中的属性不能被覆盖
因此bootstrap文件的应用场景主要是
*使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
*一些固定的不能被覆盖的属性
*一些加密/解密的场景;
.yml和.properties格式区别
主要是书写格式的不同
.yml格式文件采用k:空格v,通过垂直对齐来指定层次关系的方式来书写
.properties格式文件采用k=v的形式书写
当这两个文件同时存在,且属性覆盖冲突时,.properties的优先级比.yml优先级高
.yml文件不支持@PropertyResource注解自动导入配置
application.properties和application.yml文件可以存在于四个地方
1、 file:项目根目录\
2、 file:项目根目录\conf\
3、 classpath:项目根目录\
4、 classpath:项目根目录\conf
这四个地方存储的文件中设置的属性若不冲突则相互补充,若冲突则优先级从高到低
修改SpringBoot默认约定的几种设置参数方法
1、 内部配置文件,如上面所述的.yml和.properties文件
2、 外部配置文件D:/appication.properties,如果一个属性配置在内部文件和外部文件中冲突,则外部>内部
调用外部配置文件的两种方式:
* 打成jar包后在命令行配置java -jar 项目名.jar --spring.config.location = D:/application.properties
* 在编辑器(如IDEA)中的Run configuration ,argumenets中配置
3、 命令行运行参数
同理也可以在编辑器中设置Run configuration ,argumenets或者打成jar包之后运行时添加命令行参数
多环境切换(profile)
有静态切换环境和多态切换环境两种方式:
静态切换
静态切换又分为在.properties和在.yml中设置两种方式
1、 设置多个.properties文件
application.properties(默认)
application-dev.properties
application-test.properties
application-prod.properties
在不同的环境配置文件中配置不同的参数,然后在application.properties中设置spring.profiles.active = dev/test/prod
2、 在.yml文件中设置
在.yml文件中配置,不用新建多个文件,配置方式如下
spring: profiles: active: dev --- spring: profiles: dev server: port: 8080 --- spring: profiles: test server: port: 8081
动态切换
1、 在开发工具如IDEA中设置RunConfiguration -Argument -program Argument
增加参数--spring.profiles.active = 环境名
2、 命令行运行jar包时指定运行参数
3、 通过设置jvm参数 RunConfiguration -Argument - VM
增加参数-Dspring.profiles.active = 环境名
SpringBoot注入值的几种方式
1、 使用配置文件注入的方式
(1)默认可识别application.yml和application.properties两个文件的设置
(2)识别.properties文件中的配置,使用@PropertySource(value={"classpath:conf.properties"})注解
(这种方式只能用.properties文件不能使用.yml文件)
使用这种方式在要注入class类上添加@Component和@ConfigurationProperties(prefix = 'xx')
在配置文件里用xx.属性名 = 值来注入值(.yml格式应对于改变)
2、 使用@Value("")直接在属性上注入
3、 两种方式的区别
简单类型:(8个基本类型/String/Date)
4、 使用@ImportSource注入(不推荐用法)
如果写了Spring以前那种.xml配置文件,SpringBoot默认是不识别的
如果非要使用,可以在主配置类上使用@ImportSource(locations="XXXXX")注解来指定路径来注入值
SpringBoot starter
SpringBoot starter 是SpringBoot项目的启动器,SpringBoot将各个应用,第三方框架设置成了一个个‘场景’starter,
你需要用到哪个场景你就引入哪个场景,SpringBoot会自动引入该场景需要的所有依赖
如引入spring-boot-starter-web就会引入构建一个web项目所需要的所有依赖,包括json、tomcat、webmvc