当前位置: 首页 > news >正文

第九章 SpringBoot 自动配置原理 入门

1. 引导加载自动配置类

@SpringBootApplication

-- @SpringBootConfiguration

-- @EnableAutoConfiguration

-- @ComponentScan

//@SpringBootApplication@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication{}

1.1 @SpringBootConfiguration

@Configuration。代表当前是一个配置类

1.2 @ComponentScan

指定扫描哪些,Spring注解;

1.3 @EnableAutoConfiguration

@EnableAutoConfiguration

-- @AutoConfigurationPackage

-- @Import(AutoConfigurationImportSelector.class)

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
1.3.1 @AutoConfigurationPackage

@AutoConfigurationPackage

-- @Import(AutoConfigurationPackages.Registrar.class)

自动配置包 , 指定了默认的包规则(扫描启动类包下的组件)

@Import(AutoConfigurationPackages.Registrar.class)  //给容器中导入一个组件
public @interface AutoConfigurationPackage {}//利用Registrar给容器中导入一系列组件
//将指定的一个包下的所有组件导入进来?MainApplication 所在包下。static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {@Overridepublic void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {// 1、当前启动类目录下的组件注册register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));}
}//2、构造器再默认加载basePackages和basePackageClasses下面的组件注册
PackageImports(AnnotationMetadata metadata) {AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(AutoConfigurationPackage.class.getName(), false));List<String> packageNames = new ArrayList<>();// 获取for (String basePackage : attributes.getStringArray("basePackages")) {packageNames.add(basePackage);}for (Class<?> basePackageClass : attributes.getClassArray("basePackageClasses")) {packageNames.add(basePackageClass.getPackage().getName());}if (packageNames.isEmpty()) {packageNames.add(ClassUtils.getPackageName(metadata.getClassName()));}this.packageNames = Collections.unmodifiableList(packageNames);}
1.3.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
1.3.3
http://www.lryc.cn/news/119899.html

相关文章:

  • String str=new String(“tango“) 创建了几个对象?
  • 引入三阶失真的非线性放大器的模拟输出及使用中值滤波器去除峰值研究(Matlab代码实现)
  • 【观察者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
  • 精细解析中文公司名称:智能分词工具助力地名、品牌名、行业词和后缀提取
  • 网络编程(JavaEE初阶系列10)
  • Git常用的指令
  • LoadRunner(2)
  • CTF之逆向之阿里巴巴
  • Labview控制APx(Audio Precision)进行测试测量(五)
  • 在单元测试中使用Jest模拟VS Code extension API
  • django boostrap html实现可拖拽的左右布局,鼠标拖动调整左右布局的大小或占比
  • 谈谈闭包和闭包使用场景
  • MATLAB算法实战应用案例精讲-【图像处理】边界框锚框
  • 04什么场景要用到微服务
  • .NET SqlSuger 简单介绍,超快开发数据库
  • SpringBoot复习:(28)【前后端不分离】自定义View
  • springcloud3 springcloud stream的学习以及案例(了解)
  • Kotlin理解内置函数
  • 手机app测试
  • Centos部署Git
  • k8s 控制器
  • 谷歌关闭跨域限制.(生成一个开发浏览器),Chrome关闭跨域
  • 实践指南-前端性能提升 270% | 京东云技术团队
  • 8月11日上课内容 nginx的多实例和动静分离
  • 腾讯云CVM服务器端口在安全组中打开!
  • k8s、docker添加daemon.json添加“exec-opts“: [“native.cgroupdriver=systemd“]后无法启动的问题
  • React组件性能优化实践
  • SpringBoot复习:(29)静态资源的配置路径
  • mysql延时问题排查
  • 接口设置了responseType:‘blob‘后,接收不到后端错误信息