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

SpringBoot-自动配置原理

@SpringBootApplication组成

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

@SpringBootConfiguration

  • @SpringBootConfiguration只是Spring标准@Configuration批注的替代方法。
  • 两者之间的唯一区别是@SpringBootConfiguration允许自动找到配置。

@ComponentScan

  • @ComponentScan("com.my.boot")
  • @Configuration 也是组件,也会被扫描进来,这样它才能生效、@bean 才能生效

@EnableAutoConfiguration

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

1. @AutoConfigurationPackage

  • 自动配置包,指定了默认的包规则
  • 在该包下的组件才可以被Springboot扫描后自动装配进IOC容器中
  • 换而言之,是指定了Springboot管控的作用范围。
//利用Registrar给容器中导入一系列组件
//将指定的一个包下的所有组件导入进来,启动类所在包下。
@Import({Registrar.class})
public @interface AutoConfigurationPackage {}

2. Registrar.class

  • metadate参数指的是注解源,此处得到的数据是启动类
  • PackageImports(metadata)导入包中的组件
  • getPackageNames()获得包名,此处得到的数据是启动类所在包
  • toArray封装到数组中
  • 最终将包下所有内容注册进去
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
}

3. @Import({AutoConfigurationImportSelector.class})

  • 利用getAutoConfigurationEntry(annotationMetadata),给容器中批量导入一些组件

  • 调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes),获取到所有需要导入到容器中的配置类

  • 利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader),得到所有的组件

  • 从META-INF/spring.factories位置来加载一个文件
    • 默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
    • spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories,自动配置类127个
    • 随着版本不断更新,自动配置类个数会有所变化

按需开启自动配置项

  1. 定义的127个场景在所有自动配置启动的时候默认全部加载
  2. 最终按照条件装配规则(@Conditional),按需配置
  3. 在application.properties配置文件中新增一行 debug=true,当应用程序运行时,可以在控制台看到哪些组件生效(Positive matches),那些组件不生效(Negative matches)
  4. 比如AopAutoConfiguration

修改默认配置

  1. 例如给文件上传解析器规范名字
  2. 对IOC容器中的命名不规范的文件上传解析器起了个别名
  3. 这个别名是SpringMVC要求的规范化名字。所以容器中的这个Bean有两个名字。
@Bean
//容器中有这个类型组件
@ConditionalOnBean(MultipartResolver.class)  
//容器中没有这个名字 multipartResolver 的组件
@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME
) 
public MultipartResolver multipartResolver(MultipartResolver resolver) {//给@Bean标注的方法传入了对象参数,这个参数的值就会从容器中找。//SpringMVC multipartResolver。防止有些用户配置的文件上传解析器命名不符合规范return resolver;
}
  • SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先
  • 主要体现在@ConditionalOnMissingBean,如果没有存在这个bean,那么springboot就会自动帮你配置
@Bean
@ConditionalOnMissingBean
public CharacterEncodingFilter characterEncodingFilter() {}
  • 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值
  • 可以通过自定义Configuration类实现对应接口(如实现WebMvcConfigurer接口进行MVC配置)进行修改所有的默认行为
  • 也可以通过改配置文件,xxxProperties 中拿到对应的默认值,然后 xxxProperties 是从 application.properties 配置文件中获取的值,因此可以修改所有的默认行为
  • application配置文件文档

Lombok

  • 安装插件Lombok

  • 引入依赖lombok
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>
  • 类上引用注解
@NoArgsConstructor
@AllArgsConstructor
@Data
@ToString
@EqualsAndHashCode
public class User {private String name;private Integer age;private Pet pet;public User(String name,Integer age){this.name = name;this.age = age;}}

dev-tools

  • 项目或者页面修改以后:按下Ctrl+F9,就是重新build
  • 项目自动重启
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional>
</dependency>
http://www.dtcms.com/a/491455.html

相关文章:

  • AI应用开发001-Conda和Jupyter Lab介绍
  • 在 Android Shell 终端上直接运行 OPENPPP2 网关路由配置指南
  • debug - MDK - arm-none-eabi - 从MDK工程做一个makefile工程出来
  • 郑州外贸网站建设商家内网网站开发报价
  • xxl-job pg数据库适配
  • OSPF路由协议重点总结
  • QT6中QToolBox功能与应用
  • Linux 进程信号机制详解
  • 淘宝客做网站推广自定义页面wordpress
  • YOLO-V1 与 YOLO-V2
  • 中科大少年班记(2025年10月)
  • 微信公众号端网站开发小程序开发费用一览表fhq华网天下
  • 体育数据库:搭建体育应用的核心「数据引擎」
  • 【JETSON+FPGA+GMSL】多功能图像采集卡,以高集成、多通道方案应对工业视觉挑战
  • 做网站教学书微信公众号下载安装
  • 【从零开始构建性能测试体系-07】理解响应时间、吞吐量与并发:性能测试关键指标解读
  • C/C++字符串
  • 上网站乱码python网站开发效率
  • 告别“搬砖”:在AI的辅助下,前端如何触及业务与架构的深水区?
  • 大显存 AI 训练实战:PyTorch/TensorFlow 参数调试与多场景落地指南
  • 石狮新站seo电子商务网站建设与管理感想
  • Socket 抓包工具与实战,从抓取到定位(Socket 的命令、分析)
  • 让安全驾驶有“AI”相伴|腾视科技DMS视频监控一体机,守护每一次出行
  • 软考高项论文考试攻略1:从趋势分析到实战技巧
  • C语言:自定义类型
  • MATLAB中双馈发电机与无刷双馈发电机低电压穿越的异同分析
  • 做公司网站需要多南京建设行政主管部门网站
  • 【CDA案例】某女装品牌如何用AARRR 模型落地实践使私域增长突围的?5分钟get到​重点
  • 企业电话交换机配置在线聊天功能安装文档
  • 公司做网站需要什么条件程序员培训机构出来找工作好找吗