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

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

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

如下为spring-mybatis配置文件:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> <!-- 导入属性配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties" /> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
</bean>
<!-- 将数据源映射到sqlSessionFactory中 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
<property name="dataSource" ref="dataSource" />
<!--<property name="mapperLocations" value="classpath:mybatis/mapper/*.xml" />-->
</bean> <!-- SqlSession模板类实例 -->
<bean id="sessionTemplate" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="close">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean> <!--======= 事务配置 Begin ================= -->
<!-- 事务管理器(由Spring管理MyBatis的事务) -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 关联数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--======= 事务配置 End =================== --> <!--mapper配置-->
<bean id="kbCityMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.spring.dao.KbCityMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
</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相关属性的初始化工作。

某些属性如下:

	private String staticPathPattern = "/**";

	public static class Servlet {

		/**
* Path of the dispatcher servlet. Setting a custom value for this property is not
* compatible with the PathPatternParser matching strategy.
*/
private String path = "/"; public String getServletMapping() {
if (this.path.equals("") || this.path.equals("/")) {
return "/";
}
if (this.path.endsWith("/")) {
return this.path + "*";
}
return this.path + "/*";
}
}

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哥的博客,直接引入这个依赖就能用了。)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.4.5</version>
<scope>compile</scope>
</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. Eclipse和MyEclipse光标变成黑色块解决办法

    今天偶然发现了一个小技巧,O(∩_∩)O~暂且可以这样说吧,我认为喽. 以前经常在编写程序是不知到碰到键盘上的那个键了,或是那几个组合键了,使得Eclipse里的代码光标变成一个黑色块:在这个状态下, ...

  2. Java基础语法:标识符

    Java所有的组成部分都需要名字. 类名.变量名 以及方法名 都被称为标识符. 一.规则 Ⅰ.首字符 规则:所有的标识符都应该以字母(A-Z 或者 a-z).美元符($).下划线(_)开始. 示例:t ...

  3. Prism -- 简介

    Prism是一个开源框架,用于在WPF.Xamarin Forms.Uno/Win UI等应用中创建松耦合.可维护.可测试的XAML应用程序.Prism提供了一组设计模式的实现,这些设计模式有助于编写 ...

  4. Android Studio|IntelliJ IDEA Git使用小技巧

    一 分支管理 1. 新建分支 在master的基础上创建新分支dev 2. 推送分支 将新建的分支dev推送到远程 3. 切换分支 4. 合并分支 当我们在dev分支完成代码修改并测试通过后 需要将d ...

  5. golang操作mysql2

    目录 Go操作MySQL 连接 下载依赖 使用MySQL驱动 初始化连接 SetMaxOpenConns SetMaxIdleConns CRUD 建库建表 查询 单行查询 多行查询 插入数据 更新数 ...

  6. Linux速通02 命令格式

    命令的格式 # 格式:命令 [选项][参数] * 命令:告诉 Linux操作系统执行什么 * 选项:说明命令运行的方式(可以改变命令的功能).以 "-"字符开始 * 参数:说明命令 ...

  7. 如何在 C# 8 中使用 Channels

    在面对 生产者-消费者 的场景下, netcore 提供了一个新的命名空间 System.Threading.Channels 来帮助我们更高效的处理此类问题,有了这个 Channels 存在, 生产 ...

  8. PyCharm之python package和directory的区别

    python作为一门解释性的脚本语言.python中模块就是指一个py文件,如果我们将所有相关的代码都放在一个py文件中,则该py文件既是程序又是是模块,但是程序和模块的设计目的是不同的,程序的目的是 ...

  9. Django常见问题集锦

    1. 解决pycharm终端/cmd运行python脚本报错"ImportError/ModuleNotFoundError:No Module named ..." 问题 项目结 ...

  10. EntityFrameworkCore之工作单元的封装

    1. 简介 2. DbContext 生命周期和使用规范 2.1. 生命周期 2.2. 使用规范 2.3. 避免 DbContext 线程处理问题 3. 封装-工作单元 3.1. 分析 3.2. 设计 ...