一文读懂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集合。

1.@SpringBootConfiguration

@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,作用为:配置spring容器(应用上下文)。注解JavaConfig类。

扩展:spring注册bean的几种常见方式

1.     通过@Configuration+@Bean

2.     通过@Component,@Controller,@Service等注解

3.     通过@Import方式,使用见

https://blog.csdn.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注释:

image.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值