使用springboot自动配置源码解读

 更新时间:2024年11月07日 15:24:51   作者:阿胜yss  
自动装配是Spring Boot的一个核心特性,允许程序员在开发中更加专注于业务逻辑,而不是花费大量的时间去配置和管理第三方组件,当开发者在pom.xml文件中添加了某个依赖后,Spring Boot通过自动配置的方式,将这些第三方组件的实例自动注入到IOC容器中

什么是自动装配

当我们程序依赖第三方功能组件时,不需要手动将这些组件类加载到IOC容器中。

例如 当程序需要用到redis时,在pom.xml文件中引入依赖,然后使用依赖注入的方式直接从IOC容器中拿到相应RedisTemplate实例。

@SpringBootApplication 作用

  • @SpringBootConfiguration:主启动类可以当做配置类使用,比如注入Bean等。
  • @ComponentScan:包扫描注解。
  • @EnableAutoConfiguration(重要):开启自动配置。

@EnableAutoConfiguration

  • @AutoConfigurationPackage : 自动配置包注解,默认将主配置类(@SpringBootApplication)所在的包及其子包里面的所有组件扫描到IOC容器中。
  • @Import : 引入相应的自动装配类,这里是导入了AutoConfigurationImportSelector类,从 所有的spring.factories 文件注入自动配置类到IOC容器。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

源码解读

@AutoConfigurationPackage

@Import 引入 Registrar配置类

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
    String[] basePackages() default {};

    Class<?>[] basePackageClasses() default {};
}
PackageImports(AnnotationMetadata metadata) {
	// 获取包名
    AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(AutoConfigurationPackage.class.getName(), false));
    List<String> packageNames = new ArrayList(Arrays.asList(attributes.getStringArray("basePackages")));
    Class[] var4 = attributes.getClassArray("basePackageClasses");
    int var5 = var4.length;
	// 获取basePackageClasses属性的属性值,并且对于的包名放入packageNames列表中
    for(int var6 = 0; var6 < var5; ++var6) {
        Class<?> basePackageClass = var4[var6];
        packageNames.add(basePackageClass.getPackage().getName());
    }

    if (packageNames.isEmpty()) {
    // 如果packageNames为空,就将AutoConfigurationPackage注解标注的类所在的包名作为packageNames
        packageNames.add(ClassUtils.getPackageName(metadata.getClassName()));
    }

    this.packageNames = Collections.unmodifiableList(packageNames);
}

@Import(AutoConfigurationImportSelector.class)

直接给到最终代码逻辑 getAutoConfigurationEntry 方法

// 判断是否开启自动配置
if (!this.isEnabled(annotationMetadata)) {
    return EMPTY_ENTRY;
} else {
    // 获取注解属性
    AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
    // 从 spring.factories 文件中获取自动配置类
    List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
    // 去掉重复的自动配置类
    configurations = this.removeDuplicates(configurations);
    // 根据注解配置 排除自动配置类
    Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
    this.checkExcludedClasses(configurations, exclusions);
    configurations.removeAll(exclusions);
    configurations = this.getConfigurationClassFilter().filter(configurations);
    this.fireAutoConfigurationImportEvents(configurations, exclusions);
    return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java学习教程之常量折叠详解

    java学习教程之常量折叠详解

    这篇文章主要给大家介绍了关于java学习教程之常量折叠的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • javaweb实战之商城项目开发(三)

    javaweb实战之商城项目开发(三)

    这篇文章主要针对javaweb商城项目开发进行实战演习,主要实现通用的BaseDao.java和使用resultMap映射关联对象,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Java数据结构之二叉搜索树详解

    Java数据结构之二叉搜索树详解

    二叉搜索树作为一个经典的数据结构,具有链表的快速插入与删除的特点,同时查询效率也很优秀,所以应用十分广泛。本文将详细讲讲二叉搜索树的原理与实现,需要的可以参考一下
    2022-06-06
  • Java正则表达式API边界匹配

    Java正则表达式API边界匹配

    这篇文章主要介绍了Java正则表达式API边界匹配,文章围绕主题展开相应的相关资料,具有一定的参考价值,需要的朋友可以参考一下
    2022-06-06
  • java三层架构原理与作用小结

    java三层架构原理与作用小结

    这篇文章主要对Java三层架构的概念、作用等进行了介绍,需要的朋友可以参考下
    2017-04-04
  • Quartz与Spring集成的两种方法示例

    Quartz与Spring集成的两种方法示例

    这篇文章主要为大家介绍了Quartz与Spring集成的两种方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • knife4j3.0.3整合gateway和注册中心的详细过程

    knife4j3.0.3整合gateway和注册中心的详细过程

    这篇文章主要介绍了knife4j3.0.3整合gateway和注册中心的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Java内存模型JMM深入解析

    Java内存模型JMM深入解析

    JMM(Java内存模型)规范了多线程环境下Java程序中变量的内存访问规则,解决了可见性、原子性和有序性问题,通过关键字和规则确保多线程程序的正确性和线程安全性,本文介绍Java内存模型JMM的相关知识,感兴趣的朋友一起看看吧
    2025-12-12
  • Java字符串String相关类常用方法详解

    Java字符串String相关类常用方法详解

    这篇文章主要介绍了Java中的字符串数据类型,包括字符串的创建、拼接、比较和常用方法,还介绍了StringBuilder和StringJoiner类的定义和使用,以及它们在内存中的管理方式,需要的朋友可以参考下
    2025-02-02
  • Java排序算法总结之选择排序

    Java排序算法总结之选择排序

    这篇文章主要介绍了Java排序算法总结之选择排序,较为详细的分析了选择排序的原理与java实现技巧,需要的朋友可以参考下
    2015-05-05

最新评论