SpringBoot启动机制(starter机制)核心原理详解
作者:MyBug
一、前言
使用过springboot的同学应该已经知道,springboot通过默认配置了很多框架的使用方式帮我们大大简化了项目初始搭建以及开发过程。
本文的目的就是一步步分析springboot的启动过程,这次主要是分析springboot特性自动装配。
那么首先带领大家回顾一下以往我们的web项目是如何搭建的,通常我们要搭建一个基于Spring的Web应用,我们需要做以下一些工作:
pom文件中引入相关jar包,包括spring、springmvc、redis、mybaits、log4j、mysql-connector-java 等等相关jar …
配置web.xml,Listener配置、Filter配置、Servlet配置、log4j配置、error配置 …
配置数据库连接、配置spring事务
配置视图解析器
开启注解、自动扫描功能
配置完成后部署tomcat、启动调试
……
花在搭建一个初始项目,可能一个小时就过去了或者半天救过了,但是用了SpringBoot之后一切都会变得非常便捷,下面我们首先来分析一下SpringBoot的起步依赖以及自动配置。
二、起步依赖
1.在我们的pom文件里面引入以下jar:
<modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--mybatis 开发包 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <!--springboot web模块支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
spring-boot-starter-web包自动帮我们引入了web模块开发需要的相关jar包。
mybatis-spring-boot-starter帮我们引入了dao开发相关的jar包。
spring-boot-starter-xxx是官方提供的starter,xxx-spring-boot-starter是第三方提供的starter。
截图看一下我们的mybatis-spring-boot-starter
可以看出mybatis-spring-boot-starter并没有任何源码,只有一个pom文件,它的作用就是帮我们引入其它jar。
2.配置数据源
spring: datasource: type: com.zaxxer.hikari.HikariDataSource url: jdbc:mysql://127.0.0.1:3306/mybatis_test username: root password: root driver-class-name: com.mysql.jdbc.Driver hikari: # 最小空闲连接数量 minimum-idle: 5 # 连接池最大连接数,默认是10 maximum-pool-size: 60 # 此属性控制从池返回的连接的默认自动提交行为,默认值:true auto-commit: true # 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟 idle-timeout: 600000 # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟 max-lifetime: 1800000 # 数据库连接超时时间,默认30秒,即30000 connection-timeout: 60000
stater机制帮我们完成了项目起步所需要的的相关jar包。那问题又来了,传统的spring应用中不是要在application.xml中配置很多bean的吗,比如dataSource的配置,transactionManager的配置 … springboot是如何帮我们完成这些bean的配置的?
下面我们来分析这个过程
三、自动配置
1.基于java代码的bean配置
以mybatis为例,在上面的截图中,我们发现mybatis-spring-boot-starter这个包帮我们引入了mybatis-spring-boot-autoconfigure这个包,如下图:
里面有MybatisAutoConfiguration这个类,打开这个类看看有些什么东西。
@Configuration注解的类可以看作是能生产让Spring IoC容器管理的Bean实例的工厂。[url=mailto:br/>@Bean注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册到spring容器中。@Bean注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册到spring容器中。@ConditionalOnBean,仅在当前上下文中存在某个bean时,才会实例化这个Bean。@ConditionalOnBean,仅在当前上下文中存在某个bean时,才会实例化这个Bean。@ConditionalOnExpression,当表达式为true的时候,才会实例化这个Bean。@ConditionalOnExpression,当表达式为true的时候,才会实例化这个Bean。@ConditionalOnMissingClass,某个class在类路径上不存在的时候,才会实例化这个Bean。@ConditionalOnMissingClass,某个class在类路径上不存在的时候,才会实例化这个Bean。@AutoConfigureAfter,在某个bean完成自动配置后实例化这个bean。@AutoConfigureAfter,在某个bean完成自动配置后实例化这个bean。@ConfigurationProperties注解的作用是把yml或者properties配置文件转化为bean。@ConfigurationProperties注解的作用是把yml或者properties配置文件转化为bean。@Configuration(@SpringBootConfiguration里面还是应用了@Configuration)@Configuration(@SpringBootConfiguration里面还是应用了@Configuration)@ComponentScan@ComponentScan@ComponentScan的作用就是自动扫描并加载符合条件的组件,比如@Component和@Repository等,最终将这些bean定义加载到spring容器中。@ComponentScan的作用就是自动扫描并加载符合条件的组件,比如@Component和@Repository等,最终将这些bean定义加载到spring容器中。@EnableAutoConfiguration注解中使用了@Import({AutoConfigurationImportSelector.class})注解,AutoConfigurationImportSelector实现了DeferredImportSelector接口,@EnableAutoConfiguration注解中使用了@Import({AutoConfigurationImportSelector.class})注解,AutoConfigurationImportSelector实现了DeferredImportSelector接口,@Configuration&与@Bean------>>>基于java代码的bean配置@Configuration&与@Bean------>>>基于java代码的bean配置@EnableConfigurationProperties与@ConfigurationProperties->读取配置文件转换为bean。@EnableConfigurationProperties与@ConfigurationProperties->读取配置文件转换为bean。
- 深入springboot原理——一步步分析springboot启动机制(starter机制)
- Android 核心分析 之八------Android 启动过程详解
- elasticsearch核心知识--26.一致性原理以及quorum机制理解
- Java学习之类加载全过程_JVM内存分析_反射机制核心原理_常量池理解
- RunLoop核心原理和机制
- Java动态代理机制原理详解(JDK 和CGLIB,Javassist,ASM)
- [置顶] Retrofit 原理 运行机制详解
- 深入理解mybatis原理(一) Mybatis初始化机制详解
- Redis容灾部署哨兵(sentinel)机制配置详解及原理介绍
- 第13章 Qt核心机制与原理
- Springboot Starter的核心实现原理
- SpringBoot启动流程及其原理
- 图文详解 Android Binder跨进程通信机制 原理
- 零基础学Qt4编程之Qt核心机制与原理之信号与槽
- 《Exploring in UE4》多线程机制详解[原理分析]
- 零基础学Qt4编程之Qt核心机制与原理之信号与槽
- 详解Spring的核心机制依赖注入
- Android 核心分析 之八------Android 启动过程详解
- 深入理解mybatis原理, Mybatis初始化SqlSessionFactory机制详解(转)
- Android 核心分析 之八------Android 启动过程详解