SpringMVC
Spring MVC是Spring框架的一个模块,专门用于构建基于Java的web应用程序。它实现了模型-视图-控制器(MVC)模式,将应用程序分为三个主要组件:
- 模型(Model):代表应用程序的数据结构,例如JavaBeans、Java对象等。
- 视图(View):负责展示数据(即模型)的界面,通常是JSP、HTML、Thymeleaf等。
- 控制器(Controller):接收用户的输入并调用模型和视图去完成用户的请求。
SpringMVC工作原理
- 用户通过浏览器发送一个request,到达服务器后,请求由DispatchServlet接收
- DispatchServlet调用HandlerMapping,找到对应处理器和拦截器返回给DispatchServlet
- DispatchServlet再调用Handler适配器,通过Handler适配器来调用具体的handler
- 因为handler可能有不同的类型,不同的实现,SpringMVC通过适配器以统一的方式调用
- handler执行异常时由异常解析器将结果解析为ModelAndView对象
- 处理完成后返回一个ModelAndView对象给DispatchServlet,其中Model是数据对象,View是逻辑上的View
- 调用视图解析器找到实际的View并渲染(将Model传给View)返回
SpringBoot
SpringBoot是一个用于简化Spring应用初始化和开发过程的框架,优点有:
- 约定大于配置:提供默认配置来快速搭建环境
- 自带tomcat服务器:可以直接运行jar包启动项目
- 自动装配与starter:自动装配实现自动配置模块和依赖的能力(自动实例化需要的Bean并注入IOC容器中),Starter基于自动装配可以快速集成,启动相关功能。
SpringBoot启动流程
- SpringBoot应用通常有一个带有main方法的主类,这是项目启动的入口,标注了@SpringBootApplication注解。
- SpringApplication的初始化
- 初始化配置类,即SpringBoot启动类
- 推断并设置WEB应用程序类型(例如引入spring-boot-starter-web包可以推断出WEB类型为Servlet)
- 加载并设置Bootstrapper,ApplicationContext初始化器,Application监听器
- 获取并设置应用程序主类的Class对象
- SpringBoot事件机制
- SpringBoot启动时创建SpringApplicationRunListeners对象(运行时监听器集合),所有相关调用都会被传递给集合中的每一个SpringApplicationRunListener(运行时监听器)
- 集合中包含EventPublishingRunListener对象(事件发布运行时监听器),它持有一个事件发布器SimpleApplicationEventMulticaster
- 当EventPublishingRunListener的各种方法被调用时,它会创建对应的事件并通过事件发布器向适合接收当前事件的ApplicationListener发布,然后ApplicationListener对事件进行处理
- 外部化配置加载
- SpringBoot启动时会加载外部化配置为Environmnet对象,通过这个对象可以拿到加载的所有外部化配置
- 外部化配置通常由application.yml文件提供,常用的外部化配置优先级顺序为:命令行参数->Java系统属性->操作系统环境变量->application.yml配置文件->Configuration注解修饰的类上的PropertySource注解->默认属性
- 启动Tomcat,加载Spring容器(ApplicationContext),初始化各种bean。
SpringBoot核心注解
@SpringbootApplication:核心注解,标识项目启动入口,包含三个注解
- @SpringBootConfiguration:标记配置类,实际就是@Configuration注解
- @EnableAutoConfiguration:开启自动装配
- @ComponentScan:开启包扫描,自动扫描和注册容器中的组件。被扫描包下被标注了@Component等注解的类,会被注入到Spring的bean容器中。默认包扫描路径为启动类所在包,可以用basePackages来定义要扫描的包。
SpringBoot自动装配
开启自动装配的注解为@EnableAutoConfiguration(集成在@SpringBootApplication中),根据项目引入的组件或依赖自动加载需要的Bean并注入IOC容器。
自动装配原理:
- SpringBoot启动时扫描到@EnableAutoConfiguration注解,其中存在一个@Import注解,执行selectImports方法,返回符合条件的配置类。
- 其中配置类信息是基于SPI机制获取的,由SpringFactoriesLoader去加载META-INF/spring.factories文件(包含所有可以被自动配置的模块),对其进行解析并自动将我们需要的Bean对象注入到IOC容器中(自动体现在没有对任何类加Configuration或Bean注解)
- 加载Bean时还可以根据@Conditional注解在不同条件下生成不同的Bean。
SPI机制
- Service Provider Interface,服务提供者接口。
- 当A要调用B的接口时,常规方式是B实现接口然后提供文档,A按照文档调用接口。SPI机制是A提供接口(不实现),B去实现接口然后告诉A实现类在哪里(例如通过META-INF/services),A找到实现类路径名后加载使用即可。
- SPI的好处是同一个接口可以由不同的服务提供者实现,并且服务使用者不用修改代码。
- SpringBoot中的SPI机制就是自动装配时的selectImports方法去寻找配置类,通过META-INF/spring.factories文件
SpringBoot的starter
用于导入一整个模块所有依赖,可以快速启动组件,常见的starter有:
- spring-boot-starter,核心启动器
- spring-boot-starter-web,创建基于SpringMVC的web应用
- spring-boot-starter-data-Redis,快速整合redis
自定义封装一个starter
- 假设这个starter功能是自定义序列化json字符串,新增一个maven项目,依赖spring-boot-autoconfigure。
- 创建核心逻辑类JsonService
- 创建自动配置类autoConfiguration,在resources目录下创建文件META-INF/spring.factories指定自动配置类为autoConfiguration
- 使用mvn install命令生成pom依赖文件进行发布,其他项目引入starter坐标就可以引用了(如果本地使用都不需要发布)