Java学习笔记---SpringBoot自动配置

1、父项目依赖管理

    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.3.4.RELEASE</version>
    </parent>
 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.3.4.RELEASE</version>
  </parent>
  • spring-boot-dependencies 几乎声明了所有开发中常用的依赖
复制代码
<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-amqp</artifactId>
        <version>${activemq.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-blueprint</artifactId>
        <version>${activemq.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-broker</artifactId>
        <version>${activemq.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-camel</artifactId>
        <version>${activemq.version}</version>
      </dependency>
      <dependency>
    ......
</dependencyManagement>
复制代码
  • 开发时导入spring-boot-starter-xxx(xxx即为某个开发场景)
    • 常见的如web开发 spring-boot-starter-web、redis   spring-boot-starter-data-redis......
    • 引入starter-xxx 此场景下所有常规依赖都会自动引入
    • 如 xxx-spring-boot-starter 是第三方提供的场景启动器
  • 自动版本仲裁,spring-boot-dependencies 中规定了当前依赖的版本(引入依赖时可以不写版本号)
    • 复制代码
      <properties>
          <activemq.version>5.15.13</activemq.version>
          <antlr2.version>2.7.7</antlr2.version>
          <appengine-sdk.version>1.9.82</appengine-sdk.version>
          <artemis.version>2.12.0</artemis.version>
          <aspectj.version>1.9.6</aspectj.version>
          <assertj.version>3.16.1</assertj.version>
          <atomikos.version>4.0.6</atomikos.version>
          <awaitility.version>4.0.3</awaitility.version>
          <bitronix.version>2.1.4</bitronix.version>
          ......
      </properties>
      复制代码
    • 修改默认版本号(在当前项目pom.xml中重写)
    • <properties>
              <mysql.version>5.1.43</mysql.version>
          </properties>

2、自动配置

    • SpringBoot会帮我们自动配置好场景下各种所需项
      • 如在web开发场景下:
        • 自动引入配置Tomcat
        • 自动配置SpringMVC
        • 自动配好Web常用组件(如 :字符编码过滤器)
      • 拥有默认的包结构,无需配置包扫描
        • 默认进行包扫描  主程序所在包以及其所有子包下
        • 改变默认扫描路径 
          •  @SpringBootApplication( scanBasePackages = "包路径" )
          •  @ComponentScan ( "包路径" )
    • @SpringBootApplication注解
      • 等同于
        • @SpringBootConfiguration
        • @EnableAutoConfiguration
        • @ComponentScan( "包路径" )
    • SpringBoot各种场景下的自动配置功能 在 spring-boot-autoconfigure 包里面

  

 

 

    • 加载自动配置类
      • @SpringBootConfiguration
        @EnableAutoConfiguration
        @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
                @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
        public @interface SpringBootApplication{}

        三个注解

        • @SpringBootConfiguration 表示当前是一个配置类
        • @ComponentScan 指定包扫描
        • @EnableAutoConfiguration
          • @AutoConfigurationPackage
            @Import(AutoConfigurationImportSelector.class)
            public @interface EnableAutoConfiguration {}
          • @AutoConfigurationPackage :负责保存标注相关注解的类的所在包路径,向容器注入组件,名称是全类名,值是PackageImports,里面包含一个集合,集合中存储packageNames,也就是我们注解所在包。说白了,就是把我们注解所在包路径加入了容器一个专门记录packageNames的集合里
            官方注解说明:
            (Class for storing auto-configuration packages for reference later (e.g. by JPA entity scanner).)
          • @Import(AutoConfigurationImportSelector.class): 从classpath搜寻所有META-INF/spring.factories文件,借助SpringFactoriesLoader来根据autoConfigurationMetadata加载符合条件的AutoConfiguration。

            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

        • 最后按需开启自动配置( 按照条件装配规则(@Conditional),最终会按需配置。 )
    • 总结 and 其他
      • SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
      • 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
      • 生效的配置类就会给容器中装配很多组件
      • 只要容器中有这些组件,相当于这些功能就有了
      • 定制化配置
        • 用户直接自己@Bean替换底层的组件
        • 用户去看这个组件是获取的配置文件什么值就去修改。

 3、开发工具

    • Lombok : 简化JavaBean开发

    • dev-tools : 热部署,修改后 ctrl + f9 重新编译即生效     

posted @   __three  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示