SpringBoot是什么
是spring的子项目,主要简化Spring开发难度,去掉了繁重的配置,提供各种启动器,可以让程序员快速上手,节省开发时间
SpringBoot的优点
SpringBoot对上述的Spring的缺点进行改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与业务之间进行思维的切换,全身心投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期
版本锁定 解决shmaven依赖版本容易冲突的问题,集合了常用的并且测试过的所有版本,使用Starter启动器管理依赖并能对版本进行集中的控制如下的父工程带有版本号,就是对版本进行了集中控制
起步依赖:解决了完成某个功能要整合的jar包过多的问题,集合了常用的jar包
自动配置:解决了整合框架或者技术的配置文件过多,集合了所有的约定的默认配置
内置Tomcat:通过内置的tomcat,无需再其他外置的Tomcat就直接可以运行JAVAEE程序
总之:人们把SpringBoot称为搭建程序的脚手架,其最主要的作用就是帮我们快速的构建庞大的Spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让我们关注于业务而非配置
运行SpringBoot项目的方式
可以打包
可以使用Maven插件直接运行
直接运行main方法
SpringBoot的启动器 starter
什么是starter
starter启动器,看可以通过启动器集成其他的技术,比如说web,mybatis,redis等等,可以提供对应技术的开发和运行环境
比如pom中引入spring-boot-starter-web,就可以进行web开发
starter执行原理
SpringBoot在启动时候会扫描jar包中的spring.factories
根据文件中的配置,去加载自动配置类,配置文件格式是key=value,value中配置了很多需要Spring加载的类
Spring会去加载这些自动配置类,Spring读取后,就会创建这些类的对象,放到Spring容器中后期会从Spring容器中获取这些类对象
SpringBoot中常用的启动器
spring-boot-starter-web提供web技术支持
spring-boot-starter-test
spring-boot-starter-jpa
spring-boot-starter-redis等等
SpringBoot运行原理刨析
SpringApplication类作用及run方法的作用
SpringApplication这个类整合了其他框架的启动类,只要运行了这个类所有的整合都完成了
调用run方法,将当前启动类的字节码传入主要目的是传入@SpringBootApplication这个注解,以及main方法的args参数
通过获取当前启动类的核心信息,创建IOC容器
当前启动类@SpringBootApplication详细刨析
run方法传入的当前启动类字节码,最重要的是传入了@SpringBootApplication点开这个注解源码,会发现有多个注解组成,接下来会详细解释每个注解的含义
点来这个注解源码,发现有四类注解
第一类:JDK原生注解4个
@Target(ElementType.TYPE)当前注解的使用范围
@Retention(RetentionPolicy.RUNTIME)//生命周期
@Documented//声明在生成doc文档是否带着注解
@Inherited//声明是否子类会显示父类的注解
第二类:@SpringBootConfiguration
点开注解源码,会发现本质是@Configuration定义该类是个配置类功能等同于xml
配置文件 提到@Configuration就要提到他的搭档@Bean使用这两个注解就可以创建一个简单的Spring配置类,可以用来替代相对应的xml配置文件可以理解为创建了IOC容器
第三类@ComponenScan,包扫描功能
这个注解对应的Spring的XML配置中的@ComponentScan,其实就是自动扫描并加载符合条件的组件比如@Component和@Repository等或者bean定义最终将这些bean定义加载到IOC容器中
也可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定则默认扫描@ComponentScan所在类的package以及子包进行扫描
注:所以pringBoot的启动类最好放在rootPackage下,因为默认不知定basePackages,这样扫描root package及子包下的所有类
第四类:@EnableAutoConfiguration
点开源码会发现本质是@import,自动导入功能
1.@EnableAutoConfiguration也是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IOC容器中,
@EnableAutoConfiguration会根据类路径中的jar依赖为项目自动配置,如添加了spring-boot-starter-web依赖,会自动添加Tomcat和SpringMVC的依赖,SpringBoot会对Tomcat和SpringMVC进行自动配置
那么SpringBoot是如何完成自动配置的呢?
A。SpringBoot自动配置的注解是@EnableAutoConfiguration
B我们用的时候是在启动类上加@SpringBootApplication这个注解是复合注解内部包含@EnableAutoConfig
C@EnableAutoConfiguration内部有一个@Import,这个注解才是完成自动配置的关键
D@Import导入这个类AutoConfigurationImportSelector这个类内部提供了一个方法selectImports这个方法会扫描导入的所有jar包下的spring.factories文件解析文件中的自动配置类key=value,将列表中的类创建,并放到Spring容器中
总结
总之一个@SpringBootApplication注解就搞定所有事,它封装了核心的@SpringBootConfiguration+@EnableAutoConfiguration+@ComponentScan这三个类,大大节省了程序员配置时间,这就是SpringBoot的核心设计思想
SpringBoot中的配置文件
有那些配置文件?
bootstrap:yml/application
application:yml/application
上面两种配置文件有什么区别?
1.bootstrap由父ApplicationContext加载,比application配置文件优先加载
2.bootatrarp里的属性不能被覆盖
3application:springboot项目中的自动化配置
4.bootstrap:
使用spring cloud config配置中心时,需要加载链接配置中心的的配置属性的,就可以使用bootstrap来完成
加载不能被覆盖的属性
加载一些加密/解密的数据
读取配置文件的方式
读取默认配置文件
需要注入Environment类,使用environment.getProperty中的key这样就能获得key对应的value值
@Value直接读取
读取自定义配置文件
自定义配置文件后缀名必须是.properties
编写和自定义的配置文件对应的java类,类上放三个注解
@ConfigurationProperties(“前缀”)
@PropertySource(指定配置文件)
@Component包扫描
读取的时候就跟读取默认配置文件一样
SpringBoot支持那些日志框架
JavaUtils logging
Log4J2
lockBack
如果使用了启动器那么springboot默认将lock作为日志框架
springBoot常用注解
@springBootApplication:它封装了核心的@SpringBootConfiguration+@EnableAutoConfiguration+@ComponentScan这三个类大大节省了程序员的配置时间,这就是SpringBoot的核心设计思想
@EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加载到IOC容器
@MapperScan:spring-boot支持mybattis组件的一个注解,通过此注解指定mybatis接口类的路径即可完成对mybatis接口的扫描,这就是SpringBoot的核心设计思想
@RestController是@Controller和ResponseBody的结合,一个类被加上@RestController注解数据接口就不需要再添加@ResposeBody更加简洁
@RequestMapping我们都需要明确请求路径
@GETMapping,@PostMapping,@PutMapping@DeleteMapping结合@RequestMapping使用是rest风格的指定更明确的子路径
@PathVariable路径变量注解,用{}来定义url部分的变量名
@Service这个注解用来标记业务层的组件,我们会将业务的逻辑处理的类都会加上这个注解交给Spring容器,事务的切面也会配置在这一层当然这个注解不是一定要用,有个泛指组件的注解,当我们不能确定具体作用的时候,可以泛指这个组件的注解托付给spring容器
@Component和Spring的注解功能一样,注入到IOC容器中
@Component和Spring的注解功能一样,注入到ioc容器中
@ControllerAdvice和@ExceptionHandler配合完成统一异常拦截处理