通过helloSpringBoot程序,我们已经发现了SpringBoot的简便快捷之处,这种简便之处来源于SB的两大特性:依赖管理和自动配置。
依赖管理特性:
1.父项目做依赖管理:父项目已经包含了几乎所有SB开发所需的依赖。因此我们引入依赖默认都可以不写版本,但引入非版本仲裁的jar,要写版本号。

2.starter场景启动器
在SB中有很多spring-boot-starter-*的依赖,只要引入了这种依赖,这个场景所有的常规依赖都会被引入。

自动配置特性:
1.自动配置Tomcat;自动配置SpringMVC
2.自动配好Web常见功能,如:字符编码问题
3.默认的包结构:主程序所在包及下面所有子包里的组件都会被默认扫描(想要改变扫描路径,@SpringBootApplication(scanBasePackages="com.atguigu")
或者@ComponentScan 指定扫描路径)
@SpringBootApplication
等同于
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.atguigu.boot")
4.各种配置都有默认值,默认配置最终都映射到MultiPartProperties;配置文件的值最终会绑定到每个类上,这个类会在容器中创建对象。
5.按需加载所有自动配置项:引入哪个场景,才会开启哪个场景的配置文件
几种底层注解:
1.@Configuration
用来注解类,代表此类是个配置类。如下所示:

@Bean注解修饰配置类中的方法,往容器中添加组件,以方法名为组件的id,返回类型就是组件的类型,返回值就是组件在容器中的实例。例如如上程序就向容器中添加了User组件,实例为18岁的张三。
注意:
1.此处添加的组件默认是单实例的。
2.配置类(MyConfig)本身也一个组件,而且是个增强了的代理组件。
3.@Configuration有一个属性:proxyBeanMethod,默认为true,代表当调用此组件时,会去容器里面找(单实例),若为false,则每次新建一个实例。
2.@Import:向容器中导入指定组件
例如@Import(User.class):便向容器中自动创建了User类型的组件
3.@Conditional
条件装配:满足conditional指定的条件,才会执行组件注入。

4.@ImportResource:导入Spring配置文件
例如@ImportResource("classpath:beans.xml")
5.@ConfigurationProperties:配置绑定
如果想让一个javaBean和配置文件中的信息一一绑定,就用容器中的组件(容器中的组件是指这个类要注解了@Component、@Service等)的@ConfigurationProperties注解,利用类中的属性读取配置文件中的信息。
例:

假设resources下有一个application.properties文件,其中有这样两条信息:mycar.brand=奔驰,mycar.price=300000,则获取容器中的car实例时,便可以读取这些信息。
第五点中的功能也可以通过如下方式来实现:
6.@ConfigurationProperties+
@EnableConfigurationProperties
在配置类上标@EnableConfigurationProperties注解,并填入要开启配置绑定的类,如下:

此注解的两个功能如上所示,这样就不用在Car类上标@Component注解,Car也能作为组件被注册进容器中。
自动配置的源码分析:
前面提到,主程序类的@SpringBootApplication注解相当于@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个注解,下面依次分析。

@SpringBootConfiguration:
代表主程序类是一个配置类
@EnableAutoConfiguration:
@AutoConfigurationPackage和@Import(AutoConfigurationImportSelector.class)的结合体。
1.@AutoConfigurationPackage
@Import(AutoConfigurationPackages.Registrar.class) //给容器中导入一个组件
public @interface AutoConfigurationPackage {}
//利用Registrar给容器中导入一系列组件
//将指定的一个包下的所有组件导入进来?MainApplication 所在包下。
2.@Import(AutoConfigurationImportSelector.class)
1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
2、调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类
3、利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件
4、从META-INF/spring.factories位置来加载一个文件。
默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories
springBoot的关键一点:虽然在一开始就写死了所有配置类,但按照条件装配原则,最后还是会按需配置。
@ComponentScan:
指明要扫描哪些地方
总结:
SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
生效的配置类就会给容器中装配很多组件
只要容器中有这些组件,相当于这些功能就有了
定制化配置的两种方法:
1.用户直接自己@Bean替换底层的组件
2.用户去看这个组件是获取的配置文件什么值就去修改:
xxxxxAutoConfiguration ---> 组件 ---> xxxxProperties里面拿值 ----> application.properties
网友评论