热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot自动配置实现的详细步骤

这篇文章主要为大家介绍了SpringBoot自动配置实现详细的过程步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

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,最后我们所有相关的包就进来了。

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

1. 父项目

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

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

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

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

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

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


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

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

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

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

举个例子:

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

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

(2)使用指定的版本

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

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

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


      5.1.43
  

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

2. 场景启动器

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


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

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

什么是 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 场景所用到的依赖了。

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

二、自动配置

这里再回顾一下之前的 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类型。

@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);
        }
    }
}

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

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

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

2. 默认的包结构

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

但是要注意这里的范围:

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

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

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

@SpringBootApplication(scanBasePackages = "com.pingguo")
public class MainApplication {
    public static void main(String[] args) {
... ...

3. 各种配置拥有默认值

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

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

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

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。

三、小结

经过上面的步骤,我们开发应用就基本可以做到 0 配置,既方便又快捷。

我理解是,springboot 通过各种巧妙的封装,把你可能要用到的场景下的一切都准备好,你需要用直接申明一下(引入场景)就好。

帮助我们彻底摆脱配置地狱,专注于业务。

以上就是SpringBoot自动配置实现详细过程的详细内容,更多关于SpringBoot自动配置过程的资料请关注其它相关文章!


推荐阅读
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
author-avatar
手机用户2602918163
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有