一文读懂Spring Boot原理
什么是SpringBoot
SpringBoot基于强大的Spring框架,推崇JavaConfig的配置和注解的方式,并且默认配置满足绝大多数场景的需要的web开发框架;比如在pom文件中引入spring-boot-starter-web依赖,就会把web开放所需要的jar包统一引入,降低pom的复杂度。Spring Boot通过内嵌Servlet容器(Tomcat、Jetty,等等)的方式,可以以jar包的形式独立运行一个web项目。
SpringBoot其实就是是一个服务于框架的框架,服务范围是简化配置文件。就是把各种框架做整合集成。可以快速搭建开发一个web项目
SpringBoot 优点
自动配置
起步依赖
应用监控Actuator
内嵌容器
YML配置文件
SpringBoot和SpringMVC的区别
Spring MVC提供了一种轻度耦合的方式来开发web应用。是基于Servlet 的一个 MVC 框架主要解决 WEB 开发的问题。
Spring Boot实现了自动配置,降低了项目搭建的复杂度,一套快速开发整合包。
SpringBoot注解
@SpringBootApplication是注解@SpringBootConfiguration,@EnableAutoConfiguration和
@ComponentScan集合。
@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,作用为:配置spring容器(应用上下文)。注解JavaConfig类。
扩展:spring注册bean的几种常见方式
1. 通过@[email protected]
2. 通过@Component,@Controller,@Service等注解
3. 通过@Import方式,使用见
https://blog.****.net/mamamalululu00000000/article/details/86711079
4. 通过EnableConfigurationProperties使配置类(@ConfigurationProperties)注入,@ ConfigurationProperties也可以采用@Component注入,但有时由于扫描路径的原因使得无法被扫描到
@EnableAutoConfiguration
自动配置,可以将所有符合条件的@Configuration配置都加载到当前容器,从classpath中
搜寻所有的META-INF/spring.factories配置文件,并将其中
org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。
可以自定义排除。排除方式有2中,一是根据class来排除(exclude),二是根据class name(excludeName)来排除
@ComponentScan
根据spring boot约定好的目录结构,所有应用程序组件将被自动注册为Spring Beans。
SpringBoot自动配置
springboot 自动配置 主要通过@EnableAutoConfiguration, @Conditional,
@EnableConfigurationProperties或者@ConfigurationProperties几个注解来进行自动配置。
@EnableAutoConfiguration开启自动配置,主要作用就是调用core包里的loadFactoryNames,将autoconfig包里的已经写好的自动配置加载进来。
@Conditional条件注解,通过判断类路径下有没有相应配置的jar包来确定是否加载和自动配置这个类,
@EnableConfigurationProperties的作用就是,给自动配置提供具体的配置参数,只需要写在application.properties中,就可以通过映射写入配置类的Pojo属性中。
1.自动配置类都存放在spring-boot-autoconfigure.RELEASE.jar下的
org.springframework.boot.autoconfigure. spring.factories;
这个类进行了简单的Spring配置,声明了Mybatis所需典型Bean,和其它很多类一样,重度依赖于Spring Boot注释:
1)@ConditionOnClass**一个配置,当类路径中存在这个类时才会配置该类
2)@EnableConfigurationProperties自动映射一个POJO到Spring Boot配置文件(默认是application.properties文件)的属性集。
3)@ConditionalOnBean启用一个Bean定义,仅仅在当前上下文中存在某个对象时,才会实例化一个Bean
发现@Spring的Configuration,俨然是一个通过注解标注的springBean,
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class})这个注解的意思是:当存在SqlSessionFactory.class, SqlSessionFactoryBean.class这两个类时才解析MybatisAutoConfiguration配置类,否则不解析这一个配置类,我们需要mybatis为我们返回会话对象,就必须有会话工厂相关类
@CondtionalOnBean(DataSource.class):只有处理已经被声明为bean的dataSource
以上配置可以保证sqlSessionFactory、sqlSessionTemplate、dataSource等mybatis所需的组件均可被自动配置,@Configuration注解已经提供了Spring的上下文环境,所以以上组件的配置方式与Spring启动时通过mybatis.xml文件进行配置起到一个效果。通过分析我们可以发现,只要一个基于SpringBoot项目的类路径下存在SqlSessionFactory.class, SqlSessionFactoryBean.class,并且容器中已经注册了dataSourceBean,就可以触发自动化配置,意思说我们只要在maven的项目中加入了mybatis所需要的若干依赖,就可以触发自动配置,但引入mybatis原生依赖的话,每集成一个功能都要去修改其自动化配置类,那就得不到开箱即用的效果了。所以Spring-boot为我们提供了统一的starter可以直接配置好相关的类。
SpringBoot的启动过程
https://www.processon.com/view/link/59812124e4b0de2518b32b6e
启动流程主要分为三个部分,第一部分进行SpringApplication的初始化模块,配置一些基本的环境变量、资源、构造器、监听器,第二部分实现了应用具体的启动方案,包括启动流程的监听模块、加载配置环境模块、及核心的创建上下文环境模块,第三部分是自动化配置模块,该模块作为springboot自动配置核心。需要看源码。
Springboot项目很多都是以jar包的形式运行,如果以war的形式运行web项目,在根目录会有一个ServletInitializer文件。
ServletInitializer继承基类SpringBootServletInitializer。
容器启动的时候会调用onStartup这个方法。通过SpringApplicationBuilder构建并封装SpringApplication对象,并最终调用SpringApplication的run方法的过程。
自定义实现一个Starter
见github: https://github.com/dscxieyong/datasource-spring-boot-starter.git