1.启动springboot引入的依赖(pom.xml的配置)
- 引入父项目(依赖管理)
父项目的父项目中声明了所有需要依赖的版本号(自动版本仲裁机制)
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.3.4.RELEASEversion>
parent>
- 如果需要其他版本
在父项目的父项目中查找到对应依赖的version版本的key
然后在当前pom.xml中的key中规定版本号即可(例如mysql驱动)
<properties>
<myesql.version>5.0<mysql.version>
properties>
- starter场景启动器
引入starter场景启动器,已经包含所有常规需要的依赖
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
+所有场景底层依赖
都有spring-boot-starter的依赖,此为springboot自动配置的核心依赖
- 简化打包部署策略
用了一下后可以直接打包成jar包直接在目标服务器上执行
<build >
<plugins>
<plugin >
<groupId> org.springframework.boot groupId >
<artifactId> spring- boot-maven- plugin artifactId >
plugin>
plugins>
build >
2.springboot配置好依赖后
- 书写主程序
用@SpringBootApplication来声明为一个主程序类 - 默认扫描:主程序所在的包以及其下面的子包会被默认扫描
用@springbootapplication自定义扫描包 - 注意
- 容器的重要性:
各种配置文件都是映射到某一个类中,配置文件的值绑定到某一个类中,然后该类在容器中创建对象 - 按需加载:
spring-boot-autoconfigure包中虽然包含有很多类,但是如果没有引入对应的依赖,里面的类也不会装配
3.容器功能的组件配置
- @Configuration设置当前类为配置类(用来导入bean的或者初始化等同于xml文件)
- 参数proxyBeanMethods = false,表明我们当前的类为正常类,可以通过方法获取一个新的组件(调用方法返回为新创建)
- 参数proxyBeanMethods = true,表明我们当前类为代理类,装入容器时运用代理类装入,调用方法时用代理类的方法,即会到容器中查找(调用方法返回仍为容器中)
- 使用中:组件依赖设置为true,其他为false
- @bean 设置当前类中的方法(方法名为bean id 返回类型为bean 的类型 返回值为具体组件)
- @Impont({User.class,DBHelper.class}) 声明在配置类中
导入这两个类到容器中(调用无参构造) - @ConditionalOnMissingBean(name = “tom”)声明在当前类中
只有当bean中没有tom时,才会注入当前类中的bean - @ImportResource(“classpath:beans.xml”) 声明在配置文件中
引入原生的配置文件
- @Component @ConfigurationProperties(prefix = “mycar”) 两者都声明在当前类中
为当前类自动装配并且运用springboot的配置文件中的mycar.属性来初始化bean - @EnableConfigurationProperties(car.Class) 声明在配置类中@ConfigurationProperties(prefix = “mycar”)声明在当前类中
4.自动配置原理
4.1拆分注解
- @SpringBootApplication可分为一下注解
- @SpringBootConfiguration 代表当前是一个配置类
- @EnableAutoConfiguration
- @AutoConfigurationPackage 自动配置包
给容器中导入指定包下的所有组件
利用Registere给容器中导入一系列组件,传入参数为当前主类名,然后再register中会将该类所在的包下的所有组件批量注册 - @Import({AutoConfigurationImportSelector.class})给容器中批量导入组件
利用getAutoConfigurationEntry(annotationMetadata)方法中获取候选配置组件,里面会默认扫描当前所有包中的META-INF/spring.factories的文件,spring-boot-autoconfigure中的META-INF/spring.factory下写死了启动的容器中加载的配置组件(?AutoConfiguration),其包有127个场景自动配置默认全部加载,最终按需配置 - 按需配置:里面全都有按条件加载的注解,并不能完全装在ConditionalOnMissingBean(name = “tom”)声明在当前类中
- @ComponentScan(com.atguigu.boot) 代表一个包扫描
指定扫描的包
4.2注解底层
- 例如是否导入DispacherServlet组件
- 找到@SpringBootApplication下的@EnableAutoConfiguration 下的@Import({AutoConfigurationImportSelector.class})中默认扫描
- 找到spring-boot-autoconfigure中的默认扫描位置中中找到了DispacherServletAutoconfigure
- 在包中找到了DispacherServletAutoconfigure的配置类
- 在配置类中看是否满足按需加载的条件(满足)
- 配置类中有一个@bean就返回了DispacherServlet类型的组件
这个bean中已经配置好了关于DispacherServlet的配置 - 故导入了DispacherServlet
- 例如是否导入文件解析器组件(防止用户配置的上传解析器名字不符合规范)
- 前面寻找方式一样
- 最后再配置类中有一个@bean返回了一个文件解析器组件
- 其中要求容器中有这个类型的组件
- 容器中没有默认名的这个组件
- @bean的方法传入文件解析器类型的组件(@bean的形参传入的对象默认都会在容器中寻找)
- 该@bean直接返回了该组件(并且修改了名字为默认名)
- 例如是否导入文件解析器(用户有了就用用户的,没有则创建)
- 前面寻找方式相同
- 最后判断@ConditionOnMissiongBean没有则创建,有则不创建
- 总结
- springboot先加载所有的自动配置类
- 每个自动配置类按照条件进行生效,默认都会绑定配置中指定的值。即properties和配置类(bean)进行了绑定。注意:该值可以在我们的application.properties中进行配置(全都有默认值)
- 每个生效的配置类会给容器中装配很多组件
- 只要容器中有这些组件,这些功能就有
- 只要用户有自己配置的,则以用户的为准
- 获取值
- autoconfiguration(加载配置类)
- 组件(配置类生效后创建bean)
- ?properties也为一个配置类(bean的默认值从?properties配置类中获取)
- 最终回归到application.properties的配置的前缀中
- 例如获取缓存的配置
- 找到依赖包的spring-boot-autoconfigure-2.3.4.RELEASE.jar
- 其下的META-INF/spring.factories包含了导入的配置
- 在org中找到cache下的CacheAutoConfiguration
- CacheAutoConfiguration的配置文件@EnableConfigurationProperties({CacheProperties.class})
- 然后找到CacheProperties类
@ConfigurationProperties(prefix = “spring.cache”) - 最终我们只需要在application.properties中写spring.cache.XXX来配置即可
4.3最佳实践
- 引入场景依赖
https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter - 查看自动配置(选底层原理)
debug=true 开启自动配置
\negetive不生效 \positive生效 - 是否需要修改
5.开发技巧
5.1 lombok
- 开发javabean 有参无参 setget 重写tostring
- 在Controller中引入slf4j的日志功能
- 步骤
- 引入依赖
- 安装插件plugin(在setting中的插件搜索下载)
- 使用注解
- @Data 生成get set方法
- @ToString 生成tostring方法
- @AllArgsConstructor和@NoArgsConsturctor为有参无参构造器(定制构造器自己写)
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
5.2 dev-tools
- 热更新 项目实时改变 ctrl F9即可实时改变(重写编译一遍)
严格意义上检测到文件有变化 则重启
如果是静态文件,则不重启,直接用 - 使用:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<optional>trueoptional>
dependency>
5.3 spring initializr(项目初始化向导)
- 直接可以选择依赖
- 直接帮我们创建好文件结构
- 创建springboot的核心配置文件
- 创建了主程序