Spring Boot系列

Spring Boot是什么,为什么要用


Spring Boot 是基于Spring的一种框架,这个框架使用了特定的方式进行配置,从而使开发人员不需要定义样板化的配置,Spring Boot集成了绝大部分目前流行的开发框架,就像Maven集成了所有的JAR包一样,Spring Boot集成了几乎所有的框架,使得开发者能快速搭建Spring项目。Spring Boot 的核心设计思想是“约定优于配置”。基于这一设计原则,Spring Boot 极大地简化了项目和框架的配置。比如在使用 Spring 开发 Web 项目时,我们需要配置 web.xml、Spring 和 MyBatis 等,还需要将它们集成在一起。而使用 Spring Boot 一切将变得极其简单,它采用了大量的默认配置来简化这些文件的配置过程,只需引入对应的 Starters(启动器),Spring Boot还提供内嵌 Servlet 容器,可选择内嵌 Tomcat、Jetty 等容器,不需要单独的 Web 服务器。这意味着不再需要启动 Tomcat 或其他任何中间件。


什么是约定大于配置


约定大于配置是一种开发原则,就是减少人为的配置,直接用默认的配置就能获得我们想要的结果。

  SpringBoot的约定大于配置,比SpringMVC,需要在web.xml里面配置前端控制器,还需要在核心配置文件(*-servlet.xml)中配置视图解析器啥的,更要配置第三方的Tomcat服务器。而SpringBoot就不需要我们配置这些,他内嵌了Tomcat服务器,我们只需要在Maven配置文件(Pom.xml)里面导入SpringMVC所需要的依赖就可以了。

  这就是SpringBoot的优势,在传统所需要配置的地方,SpringBoot都进行了约定(配置好了),开发人员能配置得更少,更直接地开发项目,写业务逻辑代码。

spring boot和maven的约定大于配置体现点:

1.maven的目录文件结构

  1)默认有resources文件夹,存放资源配置文件。src-main-resources,src-main-java

默认的编译生成的类都在target文件夹中。

  2)默认有target文件夹,将生成class文件和编程生成的jar存放在target文件夹下

2.spring boot默认的配置文件必须是,也只能是application.命名的yml文件或者properties文件,且唯一

  1)spring boot默认只会去src-main-resources文件夹下去找application配置文件


什么是Stater、如何自定义一个Stater


Starter主要是Spring Boot用来简化项目依赖的一种形式,比如spring-boot-starter-web中包含了一个Web项目通常所需要的依赖,这样我们就只需要依赖一个Starter即可,无需一个一个的添加所有的Web项目所需的Jar包,而且我们还可以通过Starter来做一些自动配置。

自定义步骤:

1,创建一个Maven工程

命名:

Spring 提供 spring-boot-stater-xxx

个人或企业:xxx-spring-boot-stater

2,导入所需依赖

3,创建自动配置类

添加注解@Configuration,编写具体代码实现自动化配置

4,定义配置文件

在 resources 下创建 META-INF 目录,创建 spring.factories 文件,在其中添加自动配置的信息

5,编译打成jar包

6,引入pom依赖


Spring Boot的启动流程


Spring Boot有一个启动类,这个启动类有一个注解@SpringBootApplication,这个注解是个复合注解,里面有个三主要的注解分别是:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

@EnableAutoConfiguration

这个注解是最为核心的,有了它就会在启动时自动导入AutoConfigurationImportSelector.class类,这个类会将所有符合条件的@Configuration配置都进行加载。

@SpringBootConfiguration

这个注解等同于@Configuration,就是将这个类标记为配置类会被加载到容器中。

@ComponentScan

这个注解的作用就是自动扫描并加载符合条件的bean。

注:如果启动类中不需要增加配置内容,也不需要指定扫描路径的话,可直接使用@EnableAutoConfiguration替代@SpringBootApplication也可以完成启动

所有Spring Boot都是由SpringBootApplication.run()方法开始,run方法执行后会经历四个阶段:服务构建,环境准备,容器创建,填充容器。

服务构建 阶段就是new 一个SpringApplication 对象,创建这个对象时,构造函数做了一些必不可少的工作,首先是要把传入的资源加载器,主方法类记录在内存中,然后逐一判断对应的服务是否存在,从而来确定web服务的类型,默认是Servlet,除此之外还有响应式非阻塞服务Reactive,还有什么都不是使用的None,确定服务后加载初始化类,读取所有META-INF/spring.factories文件的注册初始化,上下文初始化和监听器这三类配置,接下来会通过运行栈stackTrace判断出main方法所在的类,大概率是启动类本身,后续会用到,Spring服务到此算构建完成。

环境准备 阶段主要是给容器做准备,首先new一个启动上下文BootstrapContext,同时逐一调用刚刚加载的启动注册初始化器中的初始化方法,接下来将java.awt.headless这个设置改为true,表示缺少显示器,键盘等输入设备也可以正常启动,然后会启运行监听器SpringApplicationRunListeners,同时发布启动事件,获取并加载Spring-boot工程的spring.factories配置文件中的EventPublishingRunListener,这样就会将上述的监听器都引入,这样就可以通过监听这些事件来在启动流程中加入自定义逻辑。接下来通过prepareEnvironment方法来组装启动参数,首先第一步就是构建一个可配置环境ConfigurableEnvironment,根据不同的Web服务类型会构造不同的环境,构造之后会加载很多诸如系统环境变量systemEnvironment,jvm系统属性systemProperties等在内的四组配置信息,把这些配置信息都加载到一个叫做propertySourcesd的内存集合中,这样后续使用这些信息就不用重新加载了,这时也会通过配置环境configureEnvironment方法将我们启动时传入的环境参数args进行设置,例如启动时传入的诸如开发/生产,环境配置都会在这一步进行加载,接下来会发布环境准备完成这个事件,刚刚加载的监听器会监听到这个事件并且部分监听器会做相应处理(监听器通过观察者模式设计,是逐一串行执行,并不是异步并行,需要等待所有监听器执行完成后才会继续后续操作 ),紧接着将spring.beaninfo.ignore设为true,表示不加载Bean的元数据信息,同时打印Banner图,这样环境准备阶段就完成了。

容器创建 阶段将环境准备阶段的各种信息组合为容器,通过creatApplicationContext来创建容器,首先根据服务类型创建容器ConfigurableApplicationContext,默认服务是Servlet,所以创建的是注解配置的Servlet-Web服务容器,在这个过程中,会构造诸如存放和生产我们bean实例的bean工厂等,把它们都放入容器后,就要通过prepareContext方法对容器中的部分属性进行初始化,初始化和部分操作完成后发布容器准备完成监听事件,会陆续为容器注册启动参数,Banner,bean引用策略和懒加载策略等等,之后通过Bean自定义加载器将启动类在内的资源加载到bean定义池BeanDefinitionMap中,以便后续根据Bean定义创建ben对象


Spring Boot自动装配


SpringBoot自动装配主要是基于注解编程 和 约定优于配置的思想来设计的自动装配就是由Spring自动把其他组件中的Bean装载到IoC容器中,不需要开发人员再去配置文件中添加大量的配置。我们只需要在Spring Boot的启动类上添加 @SpringBootApplication 注解,开启自动装配。

@SpringBootApplication这个注解是暴露给用户使用的入口,它的底层是由 @EnableAutoConfiguration这个注解来实现的。

这样一个自动装配的实现,我把它归纳为以下三个核心步骤:

第一步:启动依赖组件的时候,组件中必须要包含@Configuration 的配置类,在这个配置类里面声明为 @Bean 注解,就将方法的返回值或者属性值 注入到IoC容器中。

第二步:如果是使用第三方jar包,Spring Boot采用SPI机制,只需要在/META-INF/目录下增加spring.factories配置文件。然后,Spring Boot会根据约定规则,自动使用SpringFactoriesLoader来加载配置文件中的内容。

第三步:Spring获取到第三方jar中的配置以后,会使用调用ImportSelector接口来完成动态加载。

这样的设计的好处在于,大幅减少了臃肿的配置文件,而且各模块之间的依赖实现了深度解耦。比如,我们使用Spring创建Web程序时需要导入非常多的Maven依赖,而Spring Boot只需要一个Maven依赖来创建Web程序,并且Spring Boot还把我们最常用的依赖都放到了一起,我们只需要 引入 spring-boot-starter-web 这一个依赖就可以完成一个简单的Web应用。

以前用Spring的时候需要XML文件配置开启一些功能,现在Spring Boot不用XML配置了,只需要写一个, 加了@Configuration注解 或者实 现对应接口的配置类就可以了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值