SpringBoot学习总结

一、零配置实现SpringBoot

如何零配置实现springboot

在没有用到SpringBoot时,构建一个Spring应用如何:

1、在web.xml手动配置Spring配置文件和DispatcherServlet
2、将项目打包放到Tomcat容器中运行。
3、Tomcat启动时,解析web.xml,Spring通过ContextLoaderListener来完成上下文环境的初始化。
4、Tomcat将web.xml中配置的前端控制器DispatcherServlet注册到Servlet中。

解决方案:

启动tomcat -> 内嵌解决
初始化Spring上下文环境 -> 利用SPI机制
动态注册DispatcherServlet -> 初始化时一并做掉

1.1 去掉xml文件

首先看springMVC中都进行了哪些配置?
springMVC中的核心配置包括 web.xml 、applicationContext.xml 、 springMVC.xml
(1)、web.xml
springMVC中的核心配置就是web.xml文件
DispatcherServlet tomcat容器相关
load–mvc.xml
load–application.xml
1 设置DispatcherServlet的init方法在web容器启动时候执行init方法
/ 配置DispatcherServlet拦截所有请求
(2)、load–mvc.xml
context:annotation-config/ 激活注解@Controller
component-scan 扫描所有Controller
viewResolver 配置一个视图解析器—在controller中返回一个字符串,解析字符串,实现页面跳转
(3)、application.xml
扫描业务类,service、dao层等。
通过在applicat.xml中配置component-scan标签完成业务类扫描

Spring官网中,关于MVC前端控制器描述如下:
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletCxt) {

    // Load Spring web application configuration
    AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
    ac.register(AppConfig.class);
    ac.refresh();

    // Create and register the DispatcherServlet
    DispatcherServlet servlet = new DispatcherServlet(ac);
    ServletRegistration.Dynamic registration = servletCxt.addServlet("app", servlet);
    registration.setLoadOnStartup(1);
    registration.addMapping("/app/*");
}

}

也即,xml核心配置文件内容可通过实现WebApplicationInitializer接口的onStartup方法进行实现。
xml中的基本配置有了,spring环境也有了,还需要实现tomcat容器。

1.2 springboot如何实现内嵌tomcat

模拟tomcat,看一下SpringBoot源码,了解springboot的内嵌tomcat哪来的


springboot的内嵌tomcat是来自引用的jar包tomcat-embed-core-9.0.14.jar,引入这个jar包,引入tomcat
此时,tomcat会启动,但是无法初始化Spring环境

1.3 tomcat启动Spring环境

本来的Spring开发流程

Tomcat
web.xml
spring.xml
Spring init

但是现在web.xml和spring.xml出现了空缺,可以通过一下方式,实现Spring的初始化

Tomcat
SeviceContainerinitializeronStart方法 通过反射得到项目当中所有的WebApplicationInittializer依次遍历,循环所有的实现类,调用
WebApplicationInitializetionStart方法
Spring init

也即通过SPI机制,在resources目录下创建以下文件,文件内容为应用初始化类的全限定名:

 META-INF/services/javax.servlet.ServletContainerInitializer

二、SpringBoot自动配置

初识Spring Boot时我们就知道,Spring Boot有一个全局配置文件:application.properties或application.yml。那么问题来了:这些配置是如何在Spring Boot项目中生效的呢?

2.1 自动配置原理

1、什么是自动配置,自动配置原理
· SpringBoot会自带一些JavaConfig类帮助做配置
· 可以通过一些条件来筛选是否需要这个配置(动态插拔)

Spring Boot关于自动配置的源码在spring-boot-autoconfigure-x.x.x.x.jar中:
在这里插入图片描述
Spring Boot的启动类上有一个@SpringBootApplication注解,这个注解是Spring Boot项目必不可少的注解。那么自动配置原理一定和这个注解有着千丝万缕的联系,定义如下:

在这里插入图片描述
@SpringBootApplication是一个复合注解或派生注解,在@SpringBootApplication中有一个注解@EnableAutoConfiguration,定义如下:
在这里插入图片描述
而这个注解也是一个派生注解,其中的关键功能由@Import提供,其导入的AutoConfigurationImportSelector的selectImports()方法通过SpringFactoriesLoader.loadFactoryNames()扫描所有具有META-INF/spring.factories的jar包。spring-boot-autoconfigure-x.x.x.x.jar里就有一个这样的spring.factories文件。

这个spring.factories文件也是一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表,这些类名以逗号分隔,如下图所示:
在这里插入图片描述
这个@EnableAutoConfiguration注解通过@SpringBootApplication被间接的标记在了Spring Boot的启动类上。在SpringApplication.run(…)的内部就会执行selectImports()方法,找到所有JavaConfig自动配置类的全限定名对应的class,然后将所有自动配置类加载到Spring容器中。

2.2 自动配置生效

每一个XxxxAutoConfiguration自动配置类都是在某些条件之下才会生效的,这些条件的限制在Spring Boot中以注解的形式体现,常见的条件注解有如下几项:

@ConditionalOnBean:当容器里有指定的bean的条件下。

@ConditionalOnMissingBean:当容器里不存在指定bean的条件下。

@ConditionalOnClass:当类路径下有指定类的条件下。

@ConditionalOnMissingClass:当类路径下不存在指定类的条件下。

@ConditionalOnProperty:指定的属性是否有指定的值,比如@ConditionalOnProperties(prefix=”xxx.xxx”, value=”enable”, matchIfMissing=true),代表当xxx.xxx为enable时条件的布尔值为true,如果没有设置的情况下也为true

@ConfigurationProperties,它的作用就是从配置文件中绑定属性到对应的bean上,而@EnableConfigurationProperties负责导入这个已经绑定了属性的bean到spring容器中(见上面截图)。那么所有其他的和这个类相关的属性都可以在全局配置文件中定义,也就是说,真正“限制”我们可以在全局配置文件中配置哪些属性的类就是这些XxxxProperties类,它与配置文件中定义的prefix关键字开头的一组属性是唯一对应的。

至此,我们大致可以了解。在全局配置的属性如:server.port等,通过@ConfigurationProperties注解,绑定到对应的XxxxProperties配置实体类上封装为一个bean,然后再通过@EnableConfigurationProperties注解导入到Spring容器中。

而诸多的XxxxAutoConfiguration自动配置类,就是Spring容器的JavaConfig形式,作用就是为Spring 容器导入bean,而所有导入的bean所需要的属性都通过xxxxProperties的bean来获得。

概括来说:
Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。
在这里插入图片描述
图片来自于王福强老师的博客:https://afoo.me/posts/2015-07-09-how-spring-boot-works.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值