Spring boot 使用了大概2年多了,虽然一直使用,但是针对spring真正的优点都没有掌握,所以现在系统的看看,spring boot 除了给开发者带来的配置的方便,还有什么特性。
一、spring boot的官方文档
spring boot 中的相关配置文件可以在这里查询 。
二、spring boot 中的依赖关系
配置一个spring boot 项目,需要在pom中引入spring boot 的父项目,其实它的目的跟平时使用的父项目是一样的,就是统一jar包版本的管理。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>版本/version>
</parent>
这样就能统一版本管理了。
如果在我们期望修改相关jar包的版本,可以进入到版本管理的文件查看集体命名规则,在自己项目中的pom改写即可。
如下:
<properties>
<mysql.version>5.1.43</mysql.version>
</properties>
- 见到很多 spring-boot-starter-* ,就是官方提供的启动器,例如我们引入了web,那么就会引入web相关的jar包
- *-spring-boot-starter,是第三方为我们提供的简化开发的场景启动器
- 官方提供的启动器,可以在官方文档中查询到
三、spring boot 的自动装配
例如引入web启动器之后,就会引入相关的 tomcat的jar包、dispatcherServlet、编码解析器、文件解析器等,所以spring boot 帮助使用者,整合了大部分的web开发场景。
同时spring boot 为使用者提供了 默认包的扫描,是主程序所在包及其下面全部的子包,都会被扫描。同时使用者也可以修改默认的扫描包。@SpringBootApplication(scanBasePackages = "*")或者@ComponentScan。
在sping boot中,有许多的复合注解 SpringBootApplication,就是如下三个注解的复合注解:
关于默认值的配置,spring boot 文件中都有相关的配置,使用者可以根据自己的需要对默认值进行覆盖,其实就是把所有的默认值最后都映射到某个bean上,例如日志配置都是映射到:
同时默认配置也是按需加载的,引入那些场景,才会开启自动配置,所有的配置都在spring-boot-autoconfigure中。
四、@Configuration
告诉spring boot 是一个配置类,等同于配置文件。
用户@Bean注解,给容器中添加组件,方法名作为组件的ID(也可以自定义),返回类型就是组件类型,同时放回的bean对象就保存在容器中。
注册的组件,就是单实例的。
属性 proxyBeanMethods = true的时候,获取到的配置类就是被代理的对象,为了保证组件单实例,外部无论对组件注册方法,调用多少次,都是从容器中拿出来的,也就是Full模式,也是解决了组件依赖的问题,防止依赖的组件和容器中的不一样。Lite模式整好与Full模式相反。
当配置类中,如果配置类中没有需要被其他组件依赖的,使用者就可以是哦用Lite模式启动,有点是启动\调用速度快(因为少了一层代理,框架也不用进行检查)。
@Import 调用无参构造方法,给容器中注册组件,默认名字就是全类名。
五、@Conditional
条件装配
例如组件A依赖于组件B,所以在组件A注册的时候,需要判断是否存在组件B,所以可以使用@ConditionalOnBean去判断是否存在组件B。
六、@ImportResource
某些使用bean.xml配置的组件,可以使用这个注解,导入相关组件。
七、配置绑定
可以让配置文件的某几个配置信息,按照一定格式,封装到bean中。
第一种方式:@Component + @ConfigurationProperties(prefix = "mycar")
配置文件中:
mycar.brand = BYD
mycar.price = 100000
bean中:
package com.test.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {
private String brand;
private Integer price;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
}
第二种方式:@EnableConfigurationProperties + @ConfigurationProperties(prefix = "mycar")
需要在配置类中,@EnableConfigurationProperties注解,如下:
有了配置绑定,当使用者在配置文件中配置了自动以属性的时候,就不用在读取配置见,可以直接映射到bean中。十分的方便。
八、自动配置原理入门
1、引导加载自动配置类
- @SpringBootConfiguration:@Configuration,设置spring boot 启动类就是一个配置类
- @ComponentScan:扫描包
- @EnableAutoConfiguration
- ① @AutoConfigurationPackage:利用Registrar类给容器导入组件
主要作用,就是把扫描的包(默认\自定义)的全部组件祖册到容器中。
- @Import({AutoConfigurationImportSelector.class}):利用getAutoConfigurationEntry给容器导入组件。
最后导入的就是
写死的配置文件,一共127自动配置类。启动就要给容器加载的配置类。但是容器会 根据实际情况进行自动的加载配置。
- ① @AutoConfigurationPackage:利用Registrar类给容器导入组件
- @EnableAutoConfiguration
2、按需开启配置自动配置项
会根据按需加载的注解(@Conditional),进行按需装配。
3、定制化修改自动配置
spring boot自动会配置相关组件,但是如果用户自己配置了,则用户的优先。
总结:
- spring boot 先加载自动配置类
- 每个自动配置类按照条件生效
- 生效的配置类就会给容器中装配很多的组件
- 只要容器中存在这些组件,则容器有拥有这些功能了
- 以用户自定义配置优先
- 用户自己@Bean 替换底层的组件
- 自动类都会属性绑定,使用者就可以在配置文件中自定义需要的属性值
4、最佳实践
- 引入场景依赖
- 查看自动配置有哪些
- 可以查看源码或者官方文档
- debug=true,控制台就可以看到哪些生效、不生效
- 分析是否修改配置项
- 参照文档,修改配置项
- 分析相关配置类
- @Bean 自定义组件,替换默认的组件
5、开发小技巧
- Lombok
- Spring initailizr:帮助使用者快速的创建spring boot的项目
- dev-tool:就是重启一下项目。