1 加载优先级:
下图三个配置文件同配置下优先级:
同时配置相同配置属性:只会加载properties.(优先级高) 其次是YML ,最后是不咋用的YAML
优先级最高:bootStrap.properties 或者 bootStrap.yml 但是它是 springCloud中的,不引入springCloud是不起作用的。
2 自动装配原理
3额外整合的jar的自动装配原理
场景:我们导入这个坐标为什么我们可以直接使用 redisTemplate
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
案例: 需求, 在spring的IOC容器中,有一个Goods的Bean,现在要求:
导入某一个坐标后,加载该Bean,没有导入则不加载。
返回true的时候就会顺利加载
既然我们知道加不加载和这个接口返回值有关 那我们就可以根据导入的类或者什么方式去判断加载呢?
@Conditional还有很多系列
如何做到自动配置redisTemplate的呢?
找一下spring-boot-autoconfigure这个包
如何不外置tomcat就能运行项目的呢?
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
当我们把上面的xml注释掉,项目启动不了,但是加上后就可以为什么呢?
那如何引入别的容器呢?
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
<scope>compile</scope>
</dependency>
@Enable*注解
springboot中提供了很多Enable*注解,这些注解都是用于动态启动某些功能的,而其底层原理是使用@Import注解导入一些配置,实现Bean的动态配置
思考为什么我们引入很多springCloud的组件很多时候还要加@Enable*注解才能开启功能呢?
- 我们的项目默认只会扫描启动类包或者子包,第三方的包路径和我们项目不一样。
- 所以我们一般会加包扫描其他jar的路径,
自己实现简易版@Enable*注解
需求是:引入第三方jar ,@Enable*注解 获取对象
demo1的pom.xml maven配置
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- 不加下面这个打出来的包不可依赖的-->
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
你会发现在demo项目中获取不到demo1项目中的这个Bean,
默认扫描是启动类包或子包路径,
@ComponentScan("com.example.demo1.*")
@Import(Demo1Config.class) 用着注解去加载类
如果我还想省事呢?
在第三方jar包,自定义注解, @EnableUser ,注解配置你想加载的类即可。
底层是由 @Import 导入你想配置的类功能实现。
@Import 能更加简洁完成功能吗?
四种用法:
1导入Bean
2 导入配置类
3 导入ImportSelector实现类。一般用于加载配置文件中的类
4 导入 ImportBeanDefinitionRegistrar实现类
方式一,导入Bean
方式二 上图注释也有体现,就不展示了
方式三 导入ImportSelector实现类
方式四:ImportBeanDefinitionRegistrar实现类
public class ImportBean implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(GoodsDemo1.class).getBeanDefinition();
registry.registerBeanDefinition("goodsDemo1",beanDefinition);
}
}
springboot自动配置流程:
我们平时开发一般都是点击run方法(启动类),他是如何做到将我们的很多类自动导入到Spring容器中的呢?
我们平时帖子都是直接告诉我们注解@Import(AutoConfigurationImportSelector.class)加载自动配置类,
- @SpringBootApplication注解下 有一个 @EnableAutoConfiguration注解,这个注解下有一个 注解@Import(AutoConfigurationImportSelector.class)加载自动配置类
- 配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,当SpringBoot应用启动时,会自动加载这些配置,初始化Bean.
- 并不是所有Bean都会被初始化,在配置类中使用Condition来加载满足条件的Bean.
那我们什么时候调用的这个注解呢@Import ?? ?
其实就是run方法里面替我们实现。
刷新上下文 中,去加载的第三方jar,因为那是 准备容器的,创建spring容器,初始化spring, 完成容器,
只是解读了源码,但是没有..
springboot源码解析详细版_plumblum的博客-CSDN博客_springboot源码怎么看
最近一场面试(Spring Boot的自动装配原理及流程)_一碗谦谦粉的博客-CSDN博客_springboot自动装配原理面试