文章挺长,表达不好,希望能有获~~~~~~~

Spring也提供使用注解来注册bean,为什么要用SpringBoot呢?

使用Spring应用,比如SpringMVC还行需要配置ViewResolver、DispatcherServlet,使用Mybatis等也需要进行其他配置。

如下为spring-mybatis配置文件:


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  6. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
  7. <!-- 导入属性配置文件 -->
  8. <context:property-placeholder location="classpath:jdbc.properties" />
  9. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  10. <property name="driverClassName" value="${jdbc.driverClassName}" />
  11. <property name="url" value="${jdbc.url}" />
  12. </bean>
  13. <!-- 将数据源映射到sqlSessionFactory中 -->
  14. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  15. <property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
  16. <property name="dataSource" ref="dataSource" />
  17. <!--<property name="mapperLocations" value="classpath:mybatis/mapper/*.xml" />-->
  18. </bean>
  19. <!-- SqlSession模板类实例 -->
  20. <bean id="sessionTemplate" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="close">
  21. <constructor-arg index="0" ref="sqlSessionFactory" />
  22. </bean>
  23. <!--======= 事务配置 Begin ================= -->
  24. <!-- 事务管理器(由Spring管理MyBatis的事务) -->
  25. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  26. <!-- 关联数据源 -->
  27. <property name="dataSource" ref="dataSource"></property>
  28. </bean>
  29. <!--======= 事务配置 End =================== -->
  30. <!--mapper配置-->
  31. <bean id="kbCityMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  32. <property name="mapperInterface" value="com.spring.dao.KbCityMapper" />
  33. <property name="sqlSessionFactory" ref="sqlSessionFactory" />
  34. </bean>
  35. </beans>

SpringBoot进行自动配置不在需用使用者进行这些配置。而且使用SpringBoot也不需要管理Mybatis、log4j、jackson等依赖包的版本问题,SpringBoot使用starter进行依赖管理。

使用SpringBoot只需在application.ymlapplication.xml添加少量配置,通过@SpringBootApplication即可启动应用。

自动装配的意义在于SpringBoot提前为我们初始化了一些东西,从SpringBoot文档中搜索Auto-configuration

对于JSON mapping libraries:

对于Spring MVC:

可以看到有对BeanNameViewResolver的自动配置。

对于模板引擎:

可以看到对Thymeleaf的自动配置,我们只需要引入Thymeleaf依赖就能直接用了,不需要任何配置。

对Reids:

还有对Security,Spring Data JPA,Elasticsearch等等很多很多,SpringBoot都对他们提前进行了一些配置,这样使得我们只需引入其依赖,只需要在application.yml少量配置甚至不需要配置就可以直接使用。


那么SpringBoot是怎么实现的?

文档说让我们浏览spring-boot-autoconfigure的源代码,那么我们就看看源码:

先说一下META-INF包下的,我们看一看additional-spring-configuration-metadata.json这个文件里有啥呢?

我们看一看其中server.port:

嗯,他默认值是8080,是不是很熟悉呢?我们进入我们项目的application.properties

那么我们再看看server.servlet.encoding.enabledserver.servlet.jsp.class-name这两个

这回我们知道原来application.properties中的默认值是从additional-spring-configuration-metadata.json这个文件来的呀。

接下来看看spring.factories文件:

里面都是一些AutoConfiguration类的完整类路径,那么我们有了类路径能干啥呢?那当然通过反射创建该类了。那么有这么多自动配置类肯定不会全部加载,那些我们要用到SpringBoot就加载哪些。

spring-autoconfigure-metadata.properties:看其内容,等号左边为类路径或属性,右边或者类路径或者值或者空。应该跟我们平常的properties文件一样的意思吧,为了不将这些配置属性在代码中写死,将其提取出来放到properties文件中。

spring-autoconfigure-metadata.json:只知道name与sourceType,type,sourceMethod建立映射关系,不知道干啥用。或许为了通过name标识值在代码中更清晰易懂吧。

继续向下看:

这里面可以看到很多熟悉的名字,我们以web包为例看一看吧:

这些类大致分为两种,一种AutoConfiguration,一种Properties

题外话:我们知道SpringBoot扫描静态资源时会在/resources/, /static/, /public/这些路径下。我们看看WebProperties.java

接着我们以WebMvcPropertiesWebMvcAutoConfiguration为例看一看吧。

WebMvcProperties:就在这个属性类中完成了webMvc相关属性的初始化工作。

某些属性如下:

  1. private String staticPathPattern = "/**";
  2. public static class Servlet {
  3. /**
  4. * Path of the dispatcher servlet. Setting a custom value for this property is not
  5. * compatible with the PathPatternParser matching strategy.
  6. */
  7. private String path = "/";
  8. public String getServletMapping() {
  9. if (this.path.equals("") || this.path.equals("/")) {
  10. return "/";
  11. }
  12. if (this.path.endsWith("/")) {
  13. return this.path + "*";
  14. }
  15. return this.path + "/*";
  16. }
  17. }

WebMvcAutoConfiguration:这个类就通过get方法,从上面的properties文件中取值,有了这些属性值,那么就能完成webMvc相关类的初始化工作了!!!

接下来从springbootApplication注解,进入来看看吧。

@SpringBootConfiguration:进去看后是一个@Configuration,因此SpringBootConfiguration注解的作用是将其注解的类注册到spring中。

@ComponentScan:组件扫描类,在此包下的被controller,service,component等注解类注册到spring中。

@EnableAutoConfiguration:以下主要分析。

查看@AutoConfigurationPackage

进入AutoConfigurationPackages.Registrar.class

debug一下registerBeanDefinitions方法:

通过上面的gif我们可以看到registerBeanDefinitions这个方法应该就是注册我们自己包下所有bean。

接着进入AutoConfigurationImportSelector.class

进入getAutoConfigurationEntry->getCandidateConfigurations->loadFactoryNames->loadSpringFactories

这里会获取到spring.factories文件,然后加载他,然后循环遍历将其放入result中。

我们debug进入时:

result为一个map,我们以org.springframework.boot.autoconfigure.EnableAutoConfiguration为key,取出那size为130的List<String>

现在我们从getCandidateConfigurations出来了,configuration的size大小130,然后去重,排除。

在执行getConfigurationClassFilter().filter(configurations);方法前configurations的size还为130。

执行之后:

最终我们加载了这23个配置类。

如何创建自己的starter:

demo project我看了,六年前更新的,使用的springboot1,很老的版本了。这个示例的pom的依赖引入的很繁杂,可以看看人家写的自动配置类,挺齐全的。

三个点:

  • pom文件引入springboot依赖(我看guide哥的博客,直接引入这个依赖就能用了。)
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter</artifactId>
  4. <version>2.4.5</version>
  5. <scope>compile</scope>
  6. </dependency>
  • 创建自动配置类,其上有必须@Configuration,其他约束性注解根据情况添加
  • 将这个自动配置类写到,spring.factories文件

终于完结。

SpringBoot自动装配,比较全的吧,来看看吧~的更多相关文章

  1. springboot自动装配

    Spring Boot自动配置原理 springboot自动装配 springboot配置文件 Spring Boot的出现,得益于“习惯优于配置”的理念,没有繁琐的配置.难以集成的内容(大多数流行第 ...

  2. SpringBoot自动装配原理解析

    本文包含:SpringBoot的自动配置原理及如何自定义SpringBootStar等 我们知道,在使用SpringBoot的时候,我们只需要如下方式即可直接启动一个Web程序: @SpringBoo ...

  3. 【Springboot】Springboot自动装配原理

    1.核心注解就是 EnableAutoConfiguration  该注解会激活SpringBoot的自动装配功能: 代码如下: @Target(ElementType.TYPE) @Retentio ...

  4. SpringBoot自动装配-自定义Start

    SpringBoot自动装配 在没有使用SpringBoot之前,使用ssm时配置redis需要在XML中配置端口号,地址,账号密码,连接池等等,而使用了SpringBoot后只需要在applicat ...

  5. SpringBoot源码学习1——SpringBoot自动装配源码解析+Spring如何处理配置类的

    系列文章目录和关于我 一丶什么是SpringBoot自动装配 SpringBoot通过SPI的机制,在我们程序员引入一些starter之后,扫描外部引用 jar 包中的META-INF/spring. ...

  6. 一步步从Spring Framework装配掌握SpringBoot自动装配

    目录 Spring Framework模式注解 Spring Framework@Enable模块装配 Spring Framework条件装配 SpringBoot 自动装配 本章总结 Spring ...

  7. SpringBoot启动流程分析(五):SpringBoot自动装配原理实现

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  8. springboot自动装配(3)---条件注解@Conditional

    之前有说到springboot自动装配的时候,都是去寻找一个XXXAutoConfiguration的配置类,然而我们的springboot的spring.factories文件中有各种组件的自动装配 ...

  9. Spring Boot之从Spring Framework装配掌握SpringBoot自动装配

    Spring Framework模式注解 模式注解是一种用于声明在应用中扮演“组件”角色的注解.如 Spring Framework 中的 @Repository 标注在任何类上 ,用于扮演仓储角色的 ...

  10. springboot自动装配原理

    最近开始学习spring源码,看各种文章的时候看到了springboot自动装配实现原理.用自己的话简单概括下. 首先打开一个基本的springboot项目,点进去@SpringBootApplica ...

随机推荐

  1. GET和POST两者的区别

    GET 和 POST 是 HTTP 协议中的两种发送请求的基本方法,对于前端开发者而言,几乎每天都在使用它们,再熟悉不过了,一般也都能说出几点两者的区别. 如果面试中被问到这个问题,先回答一下几点,肯 ...

  2. 第44天学习打卡(JUC 线程和进程 并发和并行 Lock锁 生产者和消费者问题 如何判断锁(8锁问题) 集合类不安全)

    什么是JUC 1.java.util工具包 包 分类 业务:普通的线程代码 Thread Runnable 没有返回值.效率相比Callable相对较低 2.线程和进程 进程:一个程序.QQ.exe, ...

  3. 使用docker-compose配置mysql数据库并且初始化用户

    使用docker-compose配置mysql数据库并且初始化用户 docker-compose  测试创建一个docker-compose.yml测试 以下配置了外部数据卷.外部配置文件.外部初始化 ...

  4. SpringBoot(九):SpringBoot集成Mybatis

    (1)新建一个SpringBoot工程,在pom.xml中配置相关jar依赖 贴代码: <!--加载mybatis整合springboot--> <dependency> &l ...

  5. 破解MySQL库user表hash密码

    目录 得到用户名和密码 hash 带*和不带*的区别 破解hash 在线工具 Hashcat 实验环境 select version(); 得到用户名和密码 hash mysql安装好就会默认生成图中 ...

  6. Excel技巧—开始菜单之格式刷六大功能

    转: Excel技巧-开始菜单之格式刷六大功能 点赞再看,养成习惯:千里之行,始于足下. 微信搜索[亦心Excel]关注这个不一样的自媒体人. 本文 GitHub https://github.com ...

  7. dubbo-zookeeper quick start

    目录 dubbo快速开始 服务提供者(Service provider) 定义服务接口(Defining service interfaces) 在服务提供方实现接口(Implement interf ...

  8. c++指针类型的函数

    下面随笔将讲述c++指针类型的函数. 原创链接:https://www.cnblogs.com/iFrank/p/14444379.html 指针类型的函数 若函数的返回值是指针,该函数就是指针类型的 ...

  9. 剑指 Offer 42. 连续子数组的最大和 + 动态规划

    剑指 Offer 42. 连续子数组的最大和 题目链接 状态定义: 设动态规划列表 \(dp\) ,\(dp[i]\) 代表以元素 \(4nums[i]\) 为结尾的连续子数组最大和. 为何定义最大和 ...

  10. #String类简述(小白理解,小白编写,欢迎大神指点,小白跪谢)

    @ 目录 一.前言(可忽略) 二.String变量的认知 三.String类的构造方法 四.String类的基本方法 4.1 toString()方法 4.2 equals()方法 4.3 equal ...