什么是springboot
springboot是Spring组织下的子项目,是Spring组件的一站式解决方案,主要是简化spring使用流程,精简了复杂的配置;提供了各种启动器,方便快速开发;内置了容器,程序可以独立运行。
(普通项目:Java安装,Java配置,tomcat安装,tomcat配置,maven安装,maven配置
boot项目:Java安装,配置都可以是自动的)
springboot的核心配置文件
application和bootstrap配置文件,格式任选(properties,yml两种都可以)
application用于springboot项目的自动化配置
bootstrap,一般不用,特殊情况下
使用spring cloud config组件时,需要线连接到配置中心,去加载所需要的其他配置
如果需要一些固定的不能被覆盖的属性
properties文件格式:
app.auther.name=avboy
app.auther.age=30
yml文件:
App:
Auther:
Name: avboy
Age: 30
千万不要忽略冒号后面的空格
application文件中有什么可配置的
分为3类内容
基础配置(是个springboot项目就会有的)
容器配置:
Server.port=8001
Server.context-path=/xxx
日志配置:
测试配置:自带JUnit,直接使用就行,不需要打勾
插件配置(取决于你勾选的依赖)
各种方向上,各种技术,有些被springboot集成了,其他的没有被集成,用起来不一样
比如ActiveMQ,这是被集成的
所以使用的时候,配置直接就有,填写即可
功能也有,我们的代码就是写如何使用
上图中,template对象,ActiveMQQueue对象,都是自带的,我们只关心如何使用这些拥有功能的对象
如果没被集成,比如支付宝支付
创建依赖的时候没法打勾,只能手动复制
所需的配置信息,也得自己定义,自己声明和赋值
使用时还得再导入,就跟外部配置一样
外部配置(你想写什么都行)
基本用法:配置文件中写好键值,
程序中@value使用
当所需要的属性比较多的时候,一个类出现大量的value很不方便,springboot提供了@ConfigurationProperties将属性与一个bean关联
在使用的地方:
别忘了各个属性的setter方法
如果,出现这个问题(不一定出现)
就是找配置文件的过程,没有明确的找到文件
加上提示所说的依赖
或者,明确指定要读的配置文件的位置
如果项目的配置文件想换成以前那种xml配置文件
profile配置
企业级应用一般都会,区分各种环境(开发,测试,生产)
所以,多个版本的配置文件,不同环境下使用不同的文件,走不同的配置
模板命名:application-{profile}.properties
也就是,一个项目会有多个配置文件:
在application.propertise中,就不再有具体配置内容了,直接做全局的profile配置
在dev和test文件中,就是全部的配置
如果在热部署模式下,一个程序想要切换一套配置文件,直接改这个值就行
dev和test文件的内容,还是跟以前一样
在部署之后(打成jar包),可以直接用命令修改
java -jar xxx.jar --spring.profiles.active=dev
就可以调整当前项目用哪个文件
SpringBoot启动过程(必须要会说)
进入SpringBootApplication的源码
Target,适用范围:TYPE,所有的类,接口和枚举
Retention,生命周期,runtime
这个注解会被javadoc记录
子类可以继承该注解
上面四个,对应源码中前四行,也是java注解中的必填部分
springbootconfiguration注解,继承了Configuration类,表示当前是注解类
EnableAutoConfiguration,开启springboot的注解功能,借助Import功能(点开源码)
ComponentScan扫描路径设置
核心就是后面三个注解
换句话说,一个@SpringBootApplication注解,就等价于这三个注解加在一起:
有种说法,每次写这三个比较麻烦,所以合成了一个
这三个注解分别干的事情:
@Configuration注解,这是以JavaConfig形式配置的SpringIoC容器的配置类,就是做SpringIoC容器配置
@Configuration+@Bean等价于
xml配置文件中,声明一个<bean>
详细的说就是:
任何一个标注了@Configuration的Java类,都是一个JavaConfig的配置类
等价于:
进一步的话:
等价于:
任何一个标注了@Bean的方法,其返回值作为一个bean定义注册到IoC容器中,方法名默认成为这个bean的id
再进一步,需要bean与bean之间的关系
等价于
以上也就是,SpringIoC的xml声明及注入,和代码注解方式的声明及注入,的对照举例。
@ComponentScan,功能是自动扫描并加载符合条件的组件(@Component,@Service这种类)或bean定义(上面图中那种),最终将这些bean定义加载到IoC容器中
通过basePackages等属性来指定扫描范围,如果没有,默认从@ComponentScan注解所在类的包中进行扫描
所以springboot启动类,最好放在root package下面
EnableAutoConfiguration
查看源码,两个重要的地方:
第一行注解,作用是自动配置包
第二行,导入自动配置的组件
三个注解在一起,最后效果,完整的初始化了IoC容器
在执行过程中,这一句:
会分两个阶段
首先是创建一个SpringApplication对象实例
会做:
使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer
使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationListener
根据classpath中是否存在ConfigurableWebApplicationContext
特征,来决定,是否创建一个Web类型的ApplicationContext
执行SpringApplication的run方法