0

0

SpringBoot自动配置如何实现

WBOY

WBOY

发布时间:2023-05-12 14:31:12

|

1439人浏览过

|

来源于亿速云

转载

    springboot如何实现

    在之前的 helloworld 示例中,已经初步体会到 springboot 自动导入依赖、完成配置的爽快了。

    那么,springboot 是如何实现的呢?

    一、依赖管理特性

    先看下上一篇内容示例中的pom.xml:

    
      
          org.springframework.boot
          spring-boot-starter-parent
          2.3.4.RELEASE
      
      
          
              org.springframework.boot
              spring-boot-starter-web
          
      

    这里添加了一个父项目,另外只导入了一个依赖spring-boot-starter-web,最后我们所有相关的包就进来了。

    SpringBoot自动配置如何实现

    整个过程中,无需关心导包问题。

    1. 父项目

    每一个 springboot 工程都有一个父项目,一般都是用来做依赖管理的。

    父项目中可能会申明很多的依赖,那么子项目只要继承了父项目,后续在添加依赖的时候就不需要添加版本号了。

    以上述为例,父项目使用的是2.3.4.RELEASE的 springboot 版本,所以下面添加的依赖,就无需再写版本号。

    (1)父项目如何管理版本

    可以按住ctrl,然后单击这个父项目进入一探究竟。

    SpringBoot自动配置如何实现

    进来后发现他也有一个父项目spring-boot-dependencies。

    
        org.springframework.boot
        spring-boot-dependencies
        2.3.4.RELEASE
      

    继续进入到spring-boot-dependencies,在下面可以看到一个properties标签:

    SpringBoot自动配置如何实现

    这里几乎声明了全部我们在开发中可能会用到的 jar 包的版本。

    继续往下可以看到具体的依赖管理dependencyManagement,这里引用的就是properties里申明的版本。

    SpringBoot自动配置如何实现

    举个例子:

    左侧我看到有个包是logback,那么就在里面搜索下,发现这里定义好的版本就是1.2.3。

    SpringBoot自动配置如何实现

    所以说,父项目的主要功能就是依赖管理,几乎声明了开发中常用的依赖的版本号。

    (2)使用指定的版本

    如果不要使用自动仲裁出的版本,而使用指定版本也是可以的。

    比如 mysql 版本,自动仲裁的结果是8.0.21,但是我只想用5.1.43的版本。

    SpringBoot自动配置如何实现

    添加一个properties标签,在里面申明版本即可。

    
          5.1.43
      

    再看下导入的依赖,就已经变成指定的版本了。

    SpringBoot自动配置如何实现

    2. 场景启动器

    再来看下最开始导入的一个依赖spring-boot-starter-web:

    
          org.springframework.boot
          spring-boot-starter-web
      

    后续会见到更多的以spring-boot-starter命名的启动器。在官方文档里也有详细的说明

    SpringBoot自动配置如何实现

    什么是 starter?

    starter 一组需要依赖的集合描述,也就是通常我们只需要引入一个 starter,那么对应的整个开发场景就会引入了。

    比如想开始使用 Spring 和 JPA 进行数据库访问,那么就在项目中引入spring-boot-starter-data-jpa依赖项。

    另外,注意这里spring-boot-starter-*开头的是官方的启动器命名方式。

    这么说还有非官方的?是的,如果你觉得官方给你的 starter 场景还是不能满足你的使用需要,那么你可以自定义 starter。

    但是官方推荐自定义的命名方式使用thirdpartyproject-spring-boot-starter。

    至于为什么只导入一个 starter 就可以导入整个场景的依赖,其实还是跟上面父项目一样,maven 的依赖特性。

    进入到spring-boot-starter-web,往下翻,就可以看到开发 web 场景所用到的依赖了。

    开源淘宝客淘货网
    开源淘宝客淘货网

    淘宝客开源程序-淘货网最新TopAPI淘宝客网站 淘打折淘客程序、免维护、伪静态、带缓存本程序采用asp.net 2.0进行开发,全自动应用最新淘客api,自动采集信息,无需手工更新,全站基本免维护,坐等收钱。(只需要第一次配置一下基本信息即可,无需替换,无后门)。 以下提供的演示地址和参考地址链接均需复制后粘贴在浏览器地址栏打开。 1、支持URL伪静态,全站全部实现伪静态重写,超强的SEO效

    下载

    SpringBoot自动配置如何实现

    所以,以后需要开发哪个场景,只要参考官方文档导入对应的启动器即可。

    二、自动配置

    这里再回顾一下之前的 helloworld 项目中,springboot 自动配置好了哪些东西:

    • 自动配好 tomcat

    • 自动配好 springMVC

    • 自动配好 web 常见功能,比如:字符编码问题

    • 默认的包结构:主程序所在包以及下面所有子包里的组件都会被默认扫描

    • 各种配置拥有默认值

    • 按需加载所有自动配置项

    • ......

    1. 自动配置组件

    不管自动配置好什么,步骤都是:先引入、再配置。

    比如 tomcat,那么前提是先引入了 tomcat 依赖,这就由上面第一部分内容所讲的依赖管理完成,在引入了 web starter 后,自动引入场景。

    自动引入了场景,也就引入了这个场景下所用到的各种 jar 包,接下来就是要配置这些内容,比如 tomcat、springMVC 等等。

    拿 springMVC 举例,在之前要使用 springMVC,肯定要配置DispatcherServlet,帮我们拦截所有请求。

    
            springMVC
            org.springframework.web.servlet.DispatcherServlet
            
                contextConfigLocation
                classpath:springMVC.xml
            
            1
        

    现在看下之前的 helloworld 应用中,springboot 是在哪里帮我们做好配置的。

    先看主程序类:

    // 标记这是一个 springboot应用,这个类是主程序类,所有启动的入口
    @SpringBootApplication
    public class MainApplication {
        public static void main(String[] args) {
            SpringApplication.run(MainApplication.class, args);
        }
    }

    可以创建个本地变量(alt+enter),可以看到这个是个ConfigurableApplicationContext类型。

    SpringBoot自动配置如何实现

    @SpringBootApplication
    public class MainApplication {
        public static void main(String[] args) {
            ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        }
    }

    可以使用getBeanDefinitionNames()方法,查看里面包含了哪些容器,遍历打印出来。

    @SpringBootApplication
    public class MainApplication {
        public static void main(String[] args) {
            // 返回IOC容器
            final ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
            // 查看容器里的组件
            final String[] beanDefinitionNames = run.getBeanDefinitionNames();
            for (String name: beanDefinitionNames) {
                System.out.println(name);
            }
        }
    }

    接下来启动应用,看下控制台输出。

    SpringBoot自动配置如何实现

    在控制台输出里ctrl+F搜索下DispatcherServlet:

    SpringBoot自动配置如何实现

    发现 IOC 容器中已经有了对应的组件。

    2. 默认的包结构

    主程序所在包以及下面所有子包里的组件都会被默认扫描,所以我们不需要配置开启组件扫描,也可以正常使用。

    但是要注意这里的范围:

    SpringBoot自动配置如何实现

    示例中就是com.pingguo.boot包下以及所有子包都可以自动扫描。

    如果你就是要放到外面,还希望被扫描到,怎么办?

    那么可以使用主程序类中@SpringBootApplication注解中的一个属性scanBasePackages,扩大包的范围即可:

    @SpringBootApplication(scanBasePackages = "com.pingguo")
    public class MainApplication {
        public static void main(String[] args) {
    ... ...
    3. 各种配置拥有默认值

    比如 tomcat端口,在application.properties配置文件里使用 idea 输入的时候,就可以看到带有默认值8080:

    SpringBoot自动配置如何实现

    点击进去可看到后面都是绑定了对应的 java 类。

    SpringBoot自动配置如何实现

    配置文件的值最终会绑定在对应的类上,这个类会在容器中创建对象。

    4. 按需加载所有自动配置项

    比如应用中只引入了spring-boot-starter-web,那么就只有web场景的自动配置才会开启。

    springboot 中的所有自动配置,都在这里:

    
        org.springframework.boot
        spring-boot-autoconfigure
        2.3.4.RELEASE
        compile
      

    点击spring-boot-starter-web可以找到spring-boot-starter,再进入其中就可以看到spring-boot-autoconfigure。

    相关专题

    更多
    java
    java

    Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

    804

    2023.06.15

    java正则表达式语法
    java正则表达式语法

    java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

    723

    2023.07.05

    java自学难吗
    java自学难吗

    Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

    727

    2023.07.31

    java配置jdk环境变量
    java配置jdk环境变量

    Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

    395

    2023.08.01

    java保留两位小数
    java保留两位小数

    Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

    398

    2023.08.02

    java基本数据类型
    java基本数据类型

    java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

    445

    2023.08.02

    java有什么用
    java有什么用

    java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

    428

    2023.08.02

    java在线网站
    java在线网站

    Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

    16861

    2023.08.03

    php源码安装教程大全
    php源码安装教程大全

    本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

    0

    2025.12.31

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Redis6入门到精通超详细教程
    Redis6入门到精通超详细教程

    共47课时 | 5.1万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号