0. 先说结论

  1. EnableAutoConfiguration自动装配的作用:即把指定的类构造成对象,并放入spring容器中,使其成为bean对象,作用类似@Bean注解。
  2. springboot启动的时候,会扫描该项目下所有spring.factories文件。

1. 前言

  1. 在讲EnableAutoConfiguration自动装配的使用,我们先回忆一下,之前哪里提到过这个东西。
  2. 第一次,提到是再讲SpringFactoriesLoader.loadFactories()与SpringFactoriesLoader.loadFactoryNames() 详细使用方式的时候,提到:
    在这里插入图片描述
    提到原因
    1. EnableAutoConfiguration底层实际上也是使用springfactoriesLoader
    2. 当使用第三方jar包,里面也有bean对象的时候,在自己项目启动的时候,如何将其初始化bean对象,并放入spring容器中。
  3. 第二次,提到是在 @EnableConfigurationProperties的使用方式以及作用的时候,提到:
    在这里插入图片描述
    提到原因
    1. 为什么要出现@EnableConfigurationProperties呢?
    2. 其实本质原因也是如果是第三方jar包问题,具体看下面例子,一点点引导。

2. 例子

1. springboot默认扫描路径

  1. springboot启动,需要扫描路径下的class文件,生成bean的定义BeanDefinition并创建bean对象,默认扫描路径是启动类所在的目录下
    在这里插入图片描述

  2. 如图下面的测试案例:
    在启动类所在包目录之外的类即使加了@Component,也无法被扫描到生成bean对象。
    在这里插入图片描述
    在这里插入图片描述

  3. 如果就是要扫描到启动类所在包目录之外的类,使其生成bean对象,可以在启动类上加@ComponentScan注解:
    在这里插入图片描述
    在这里插入图片描述

2. 引入第三方jar包(里面也有bean对象)

  1. 这里使用本地自己打包的jar包(SDK)作例子,如果不太了解将自己本地项目打包进本地仓库的可以看这篇文章:
    https://blog.csdn.net/xueyijin/article/details/124852621

  2. 准备一个所谓的SDK:
    在这里插入图片描述
    在测试项目中引入该SDK:
    在这里插入图片描述

  3. 测试代码:
    在这里插入图片描述

    从上述图片可以看出,我们引入SDK之后进行使用,会报找不到该bean对象,奇怪,SDK的TestDemoBean类不是加了@Component注解吗?这就跟第一大点,springboot默认扫描路径有关系,SDK中的TestDemoBean路径是com.example.jardemo.xxxx, 而测试项目中的扫描路径是:com.example.csdn,自然springboot启动无法扫描到。

  4. 提问

    1. 有的人会说:这不简单,在启动类上加上:@ComponentScan("com.example”) 就好了。
    2. 确实这样子就可以使用SDK中的bean对象了,但是你想想看,这个SDK刚刚好是com.example开头,与本测试项目前缀有重复的,倘若有其他SDK,如zki.example、abc.demo、king.shuai.demo…等等,此时你的@ComponentScan要怎么写呢
    3. 再说了,什么是SDK?是组件,是为了更加方便开发才存在的,你提供的SDK,还要别人指定要扫描你的包路径,这岂不是很失败?
      解决使用EnableAutoConfiguration自动装配
  5. 修改SDK,添加配置文件spring.factories
    在这里插入图片描述
    重新打包放入仓库中,记得重新加载一下引入的jar包,查看如下出现spring.factories文件
    在这里插入图片描述
    注:有的人可能在打包SDK的时候,发现resource目录下的文件没有打包进去,请修改pom.xml文件配置:
    在这里插入图片描述

  6. 此时,重新查看测试代码:
    在这里插入图片描述

3. 小总结一下

  1. 上述内容主要是在说:提供SDK的时候,为了方便别人可以使用本SDK的bean对象,需要在其resource/META-INF目录下创建spring.factories文件,使用EnableAutoConfiguration 把需要变成bean对象的类变成bean对象。
  2. 这样子其他项目再引用该SDK的时候,不用在启动类中编写需要扫描的路径

4. 为什么会有@EnableConfigurationProperties注解出现呢[额外个人想法]?

  1. 其实这个问题也是出自提供方的SDK,如果在提供的SDK中存在一些配置项需要配置,如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  2. 将第三方jar包全新打包入本地仓库,并使用测试代码来测试:
    在这里插入图片描述

  3. 解决方法很简单,只要跟上述解决一样,使用EnableAutoConfiguration自动装配,在SDK中的spring.factories加入该配置类的权限类路径,如下:
    在这里插入图片描述

  4. 在测试项目代码中,配置文件中加入相关配置:
    在这里插入图片描述

  5. 启动项目,没有任何问题:
    在这里插入图片描述

  6. 似乎到这里,也没有说明为什么要使用@EnableConfigurationProperties呀,都是在提及扫描不到的问题,别急,看下面

  7. 上述例子是在讲述配置类使用@ConfigurationProperties+@Component

    1. 我们知道这种方式是spring在启动的时候来扫描该类上有@Component的时候,才会把它变成bean对象,又因为是在SDK(第三方jar包),因此需要在spring.factories中EnableAutoConfiguration加上该配置类路径,使其可以被spring扫描到
    2. 但是,这有个问题,如果配置项很多了,岂不是你这个spring.factories中EnableAutoConfiguration加上该类的路径巨多,维护也不方便呀,如下:
      在这里插入图片描述
  8. 因此,该配置类我们可以使用@EnableConfigurationProperties呀,在需要使用该配置类的上面加上这个注解,会自动把该@EnableConfigurationProperties注解指定的类对象,创建bean对象,这样子就无法在写到 spring.factories上面了:
    在这里插入图片描述

  9. 重新打包,试一下呢:
    在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐