目录
3.1.1. SPI(Service Provider Interface)....................................................... 1
3.1.1.3. Springboot的spi机制.................................................................... 1
3.1.2. Srpingboot整合内容............................................................................ 1
3.1.3. Srpingboot组件内容............................................................................ 1
3.1.3.2. Autoconfigure 组件....................................................................... 1
3.1.3.4. Spring Boot CLI组件....................................................................... 1
3.2. Spring framework-(待补充)....................................................................... 1
3.5. Spring Cloud Data Flow-(待补充)............................................................... 1
3.6. Spring Web Flow-(待补充)........................................................................ 1
4.1. Spring运行方式-外置tomcat........................................................................ 1
4.2. Spring集成方式-内置tomcat(参考springboot启动流程)........................... 1
2002年10月,Rod Johnson 撰写了一本名为《 Expert One-on-One J2EE 》设计和开发的书。这本书介绍了当时 Java 企业应用程序开发的情况,并指出了 Java EE 和 EJB 组件框架中的存在的一些主要缺陷。在这本书中,他提出了一个基于普通 Java 类和依赖注入的更简单的解决方案。在书中,他展示了如何在不使用 EJB 的情况下构建高质量,可扩展的在线座位预留系统。为了构建应用程序,他编写了超过 30,000 行的基础结构代码。包含许多可重用的 Java 接口和类,如 ApplicationContext和BeanFactory。由于java接口是依赖注入的基本构建块,因此他将这些类的根包命名为com.interface21。在本书发布后不久,开发者 Juergen Hoeller 和 Yann Caroff 说服 Rod Johnson 创建一个基于基础结构代码的开源项目。
2003年2月左右,Rod、Juergen 和 Yann 开始合作开发该项目 。Yann 为新框架创造了“Spring”的名字。这样Spring项目就诞生了。
2003年8月,Spring1.0-m1
2004年3月,Spring1.0
2004年8月,Rod Johnson,Juergen Hoeller,Keith Donald 和 Colin Sampaleanu 共同创立了一家专注于 Spring 咨询,培训和支持的公司 interface21。
2006年10月,Spring 2.0
2007年11月,在 Rod 领导下,Interface21公司被更名为 SpringSource。
2007年11月,Spring 2.5
2008年4月,GitHub成立,方便了Spring代码迁移
2009年8月,SpringSource 以 4.2 亿美元被 VMWare 收购。
2009年12月,Spring 3.0
2012年7月,Rod Johnson 离开了团队。
2013年4月,VMware 和 EMC 通过 GE 投资创建了一家名为 Pivotal 的合资企业。所有的 Spring 应用项目都转移到了 Pivotal。
2012年10月,Mike Youngstrom 在 Spring jira 中创建了一个功能请求,要求在 Spring 框架中支持无容器 Web 应用程序体系结构。这一要求促使了2013年初,Pivotal开始了Spring Boot 项目的研发。
2013 年 12 月,Pivotal 宣布发布 Spring 框架 4.0。
2014年4月,Spring Boot 1.0.0 发布。Spring Boot非常简单,这样以来java开发人员能够快速地采用它。Spring Boot可以说是在 Java 中开发基于 REST 的微服务 Web 应用程序的最快方法之一。
2015年11月,Spring boot 2.0.0 发布。
2017 年 09 月,Spring 5.0 发布。
Spring 0.9
这是该框架第一个公开发布的版本,以Exper One-on-One:J2EE Design and Development一书 为基础,提供了Bean配置基础、AOP支持、JDBC抽象框架、抽象事务支持等。该版本没有官方参考文档,但可以在SourceForge上找到源代码和文档。
Spring 1.x
Spring发布的第一个带有官方参考文档(从Spring 1.1.1开始)的版本。主要由七个模块组成
Core:框架的最基本部分,提供依赖注入使你可以管理Bean容器。
DAO:提供了JDBC抽象层,从而无需进行繁琐的JDBC编码和数据库特定错误代码的解析。JDBC包不仅为实现特殊接口的类,而且为所有POJO(普通Java对象)提供了一种编程以及声明式的事务管理。
Context:ApplicationContext、UI、验证、JNDI、Enterprise JavaBean(EJB)、远程处理和邮件支持。
ORM:为流行的对象关系映射API(包括JDO,Hibernate和iBatis)提供了集成支持。
AOP:提供AOP Alliance兼容的面向切面的编程实现。
Web:提供了基本的面向Web的集成功能,如:使用Servlet侦听器初始化上下文以及面向Web的应用程序上下文。
Web MVC:为Web应用程序提供了Model-View-Controller(MVC)实现。
Spring 2.x
增加了对国际化(i18n),事件传播,资源加载以及通过Servlet容器透明创建上下文的支持。
通过使用新的基于XML Schema的配置而不是DTO格式来简化XML配置。值得注意的改进方面包括bean定义、AOP以及声明式事务。
用于Web和门户的新bean作用域(请求、会话和全局会话)。
支持AOP开发的@AspectJ注解。
Java Persistence API(JPA)抽象层。
完全支持异步JMS消息驱动的POJO(用于普通的旧Java对象)。
JDBC简化包括在使用Java5+时的SimpleJdbcTemplate。
JDBC命名参数支持(NamedParameterJdbcTemplate)。
针对Spring MVC的表单标签库。
对Porlet MVC框架的介绍。
动态语言支持。可以使用JRuby、Groovy以及BeanShell来编写bean。
JMX中的通知支持以及可控的MBean注册。
为调度任务而引入的TaskExecutor注册。
为调度任务而引入的TaskExecutor抽象。
Java注解支持,特别针对@Transactional、@Required和@AspectJ。
Spring 2.5
引入@Autowired 注解及对JSR-250注解(@Resource、@PostConstruct和PreDestroy)的支持。
引入新的构造型注解:@Component、@Repository、@Service、和@Controller。
自动类路径扫描支持,可以检测和连接带有构造型注解的类。
AOP更新,包括一个新的Bean切入点元素以及AspectJ加载时织入(weaving)。
支持完整的WebSphere事务管理。
除了SpringMVC@Controller注解,还添加了@RequestMapping、@RequestParam和@ModelAttribure注解,从而支持通过注解配置进行请求处理。
支持Tiles2。
支持JSF1.2。
支持JAX-WS2.0/2.1。
引入了Spring TestContext Framework,提供注解驱动和集成测试支持,不受所用测试框架的影响。
Spring 3.x
Spring 基于Java5的第一个版本,旨在充分利用Java5的功能,如泛型、可变参数和其他语言改进。该版本引入了基于Java的@Configuration模型。
支持Java5功能,例如泛型、可变参数以及其他改进。
对Callables、Futures、ExceutoService适配器和ThreadFactory集成提供很好的支持。
框架模块目前针对每个模块JAR都使用一课源代码树进行分别管理。
Spring Expression Language(SpEL)的引入。
核心Java Config功能和注解的集成。
通用型转换系统和字段格式化系统。
全面支持REST。
新的MVC XML名称空间和其他注解,例如Spring MVC中的@CookieValue和@RequestHeaders。
验证增强功能和JSR-303(bean验证)支持。
对JavaEE6的早期支持,包括@Async/@Asynchronous注解、JSR303、JSF2.0、JPA2.0等。
支持嵌入式数据库,例如HSQL、H2和Derby。
Spring 4.x
Spring第一个完全支持Java 8的版本。虽然仍然可以使用较旧版本的Java,但Java SE6已经提出了最低版本要求。启用的类和方法已经被删除,但模块组织几乎相同。
从先前的Spring 3 版本中删除弃用的软件包和方法。
支持Java8,将最低Java版本提高到6 update 18。
Java EE6 及以上版本现在被认为是Spring Framework 4.0的基准。
Groovy bean定义DSL,允许通过Goovy语法配置bean定义。
核心容器、测试和一般web改进。
WebSocket、SocJS、和STOMP消息。
Spring 5.x
整个框架代码都基于Java 8,并且自2016年7月起与Java 9完全兼容。
充分利用Java 8 的强大功能,从而在性能上得到极大的改进。
支持Portlet、Veloctiy、JaspReports、XMLBeans、JDO、Guava、Tiles 2和Hibernate 3。
现在XML 配置名称空间被流式传输到未版本化的模式;虽然特定版本的声明仍然被支持,但要针对最新的XSD架构进行验证。
Resource 抽象为防御 getFile 访问提供了isFile指示符。
Spring 提供的Filter实现完全支持Servlet 3.1签名。
支持 Protobuf 3.0。
支持JMS 2.0+和JPA 2.0+。
引入了Spring Web Flow,这是一个用于替代Spring MVC的项目,构建在反应式基础之上,这意味着他完全是异步和非阻塞的,主要用户事件循环执行模型,而非传统的每个请求执行模式都带有一个线程的大型线程池(基于Project Reactor构建)。
Web 和核心模块适用于反应式编程模型。
Spring 测试模块有了很大的改进。现在支持JUnit 5,引入了新的注解来支持 Jupiter 编程和扩展模型,例如@SpringUnitConfig、@SpringJUnitWebConfig、@EnabledIf和@DisabledIf。
支持在 Spring TestContext Framework 中实现并行测试执行。
Spring 总共大约有 20 个模块,由 1300 多个不同的文件构成。而这些组件被分别整合在核心容器(Core Container)、AOP(Aspect Oriented Programming)和设备支持(Instrmentation)、数据访问及集成(Data Access/Integeration)、Web、报文发送(Messaging)、Test,6 个模块集合中。以下是 Spring 5 的模块结构图。
。
核心容器由spring-beans、spring-core、spring-context 和spring-expression(Spring Expression Language, SpEL) 4 个模块组成。
spring-core 和 spring-beans 模块是 Spring 框架的核心模块,包含了控制反转(Inversion of Control, IOC)和依赖注入(Dependency Injection, DI)。BeanFactory 接口是 Spring 框架中的核心接口,它是工厂模式的具体实现。BeanFactory 使用控制反转对应用程序的配置和依赖性规范与实际的应用程序代码进行了分离。但 BeanFactory 容器实例化后并不会自动实例化 Bean,只有当 Bean 被使用时 BeanFactory 容器才会对该 Bean 进行实例化与依赖关系装配。
spring-context 模块构架于核心模块之上,它扩展了 BeanFactory,为其添加了 Bean 生命周期控制、框架事件体系以及资源加载透明化等功能。此外该模块还提供了许多企业级支持,如邮件访问、远程访问、任务调度等,ApplicationContext 是该模块的核心接口,它的超类是 BeanFactory。与 BeanFactory 不同,ApplicationContext 容器实例化后会自动对所有的单实例 Bean 进行实例化与依赖关系的装配,使之处于待用状态。
spring-expression 模块是统一表达式语言(EL)的扩展模块,可以查询、管理运行中的对象,同时也可以调用对象方法、操作数组、集合等。它的语法类似于传统 EL,但提供了额外的功能,最出色的要数函数调用和简单字符串的模板函数。这种语言的特性是基于 Spring 产品的需求而设计,它可以非常方便地同 Spring IOC 进行交互。
AOP和设备支持由由 spring-aop、spring-aspects 和 spring-instrument 3 个模块组成。
spring-aop 是 Spring 的另一个核心模块,是 AOP 主要的实现模块。作为继 OOP 后,对程序员影响最大的编程思想之一,极大地开拓了人们对于编程的思路。在 Spring 中,它是以 JVM 的动态代理技术为基础,然后设计出了一系列的 AOP 横切实现,比如前置通知、返回通知、异常通知等,同时,Pointcut 接口来匹配切入点,可以使用现有的切入点来设计横切面,也可以扩展相关方法根据需求进行切入。
spring-aspects 模块集成自 AspectJ 框架,主要是为 Spring AOP 提供多种 AOP 实现方法。
spring-instrument 模块是基于 JAVA SE 中的 java.lang.instrument 进行设计的,应该算是 AOP 的一个支援模块,主要作用是在 JVM 启动时,生成一个代理类,程序员通过代理类在运行时修改类的字节码,从而改变一个类的功能,实现 AOP 的功能。
各个模块之间的依赖关系:
数据访问与集成由 spring-jdbc、spring-tx、spring-orm、spring-jms 和 spring-oxm 5 个模块组成。
spring-jdbc 模块是 Spring 提供的 JDBC 抽象框架的主要实现模块,用于简化 Spring JDBC 操作。主要提供 JDBC 模板方式、关系数据库对象化方式、SimpleJdbc 方式、事务管理来简化 JDBC 编程, 主要实现类有 JdbcTemplate、SimpleJdbcTemplate 以及 NamedParameterJdbcTemplate。
spring-tx 模块是 Spring JDBC 事务控制实现模块。它对事务做了很好的封装,通过它的 AOP 配置,可以灵活的配置在任何一层。其实,事务是以业务逻辑为基础的,一个完整的业务应该对应业务层里的一个方法, 如果业务操作失败,则整个事务回滚。所以,事务控制是绝对应该放在业务层的,但是,持久层的设计则应该遵循一个很重要的原则:保证操作的原子性,即持久层里的每个方法都应该是不可以分割的。所以,在使用 Spring JDBC 事务控制时,应该注意其特殊性。
spring-orm 模块是 ORM 框架支持模块,主要集成 Hibernate, Java Persistence API (JPA) 和Java Data Objects (JDO) 用于资源管理、数据访问对象(DAO)的实现和事务策略。
spring-oxm 模块主要提供一个抽象层以支撑 OXM(OXM 是 Object-to-XML-Mapping 的缩写, 它是一个 O/M-mapper,将 java 对象映射成 XML 数据,或者将 XML 数据映射成 java 对象),例如:JAXB, Castor, XMLBeans, JiBX 和 XStream 等。
spring-jms 模块(Java Messaging Service)能够发送和接收信息,自 Spring Framework 4.1 以后,它还提供了对 spring-messaging 模块的支撑。
Web组件由 spring-web、spring-webmvc、spring-websocket 和 spring-webflux 4 个模块组成。
spring-web 模块为 Spring 提供了最基础 Web 支持,主要建立于核心容器之上,通过 Servlet 或者 Listener 来初始化 IOC 容器,也包含一些与 Web 相关的支持。
spring-webmvc 模块众所周知是一个的 Web-Servlet 模块,实现了 Spring MVC(model-view-Controller)的 Web 应用。
spring-websocket 模块主要是与 Web 前端的全双工通讯的协议。
spring-webflux 是一个新的非堵塞函数式 Reactive Web 框架,可以用来建立异步的、非阻塞、事件驱动的服务,并且扩展性非常好。
即 spring-messaging 模块,是从 Spring4 开始新加入的一个模块,主要职责是为 Spring 框架集成一些基础的报文传送应用。
即 spring-test 模块,主要为测试提供支持,毕竟在不需要发布(程序)到你的应用服务器或者连接到其他企业设施的情况下能够执行一些集成测试或者其他测试对于任何企业都是非常重要的。
即 spring-framework-bom(Bill of Materials)模块,主要解决 Spring 的不同模块依赖版本不同的问题。
1.概述
Java 6 has introduced a feature for discovering and loading implementations matching a given interface: Service Provider Interface (SPI).
SPI是JDK1.6引入的特性,用于发现和加载与给定接口相匹配的实现类,实现了服务提供方和使用方的解耦,并且可以实现动态加载。
2.Java SPI的定义和术语
Service(服务)
一组众所周知的编程接口和类,提供对某些特定应用程序功能或特性的访问。
A well-known set of programming interfaces and classes that provide access to some specific application functionality or feature.
Service Provider Interface(服务提供的接口)
作为服务的代理或端点的接口或抽象类。
An interface or abstract class that acts as a proxy or an endpoint to the service.
Service Provider(具体提供的服务)
SPI的特定实现。服务提供者包含一个或多个实现或扩展服务类型的具体类
服务提供者通过提供者配置文件进行配置和标识,我们将该配置文件放在资源目录META-INF/services中。文件名是SPI的全限定类名,其内容是SPI实现的全限定类名。
服务提供者以扩展名的形式安装,扩展名是一个jar文件,我们把它放在应用程序类路径、Java扩展类路径或用户定义的类路径中。
A specific implementation of the SPI. The Service Provider contains one or more concrete classes that implement or extend the service type.
A Service Provider is configured and identified through a provider configuration file which we put in the resource directory META-INF/services. The file name is the fully-qualified name of the SPI and its content is the fully-qualified name of the SPI implementation.
The Service Provider is installed in the form of extensions, a jar file which we place in the application classpath, the Java extension classpath or the user-defined classpath.
ServiceLoader(服务加载器)
SPI的核心是ServiceLoader类,它的作用是惰性地发现和加载实现。它使用上下文类路径来定位提供程序实现,并将它们放在内部缓存中。
At the heart of the SPI is the ServiceLoader class. This has the role of discovering and loading implementations lazily. It uses the context classpath to locate provider implementations and put them in an internal cache.
3.Java生态系统中的SPI示例
Java提供了很多的SPI机制的实现。下面是服务提供者接口及其提供的服务的一些示例,比较经典的就是Driver,还有SLF4J,有兴趣的可以自己去了解下。
CurrencyNameProvider: provides localized currency symbols for the Currency class.
LocaleNameProvider: provides localized names for the Locale class.
TimeZoneNameProvider: provides localized time zone names for the TimeZone class.
DateFormatProvider: provides date and time formats for a specified locale.
NumberFormatProvider: provides monetary, integer and percentage values for the NumberFormat class.
Driver: as of version 4.0, the JDBC API supports the SPI pattern. Older versions uses the Class.forName() method to load drivers.
PersistenceProvider: provides the implementation of the JPA API.
JsonProvider: provides JSON processing objects.
JsonbProvider: provides JSON binding objects.
Extension: provides extensions for the CDI container.
ConfigSourceProvider: provides a source for retrieving configuration properties。
ServiceLoader实现Iterable。
public final class ServiceLoader<S>
implements Iterable<S>
{
private static final String PREFIX = "META-INF/services/";
// The class or interface representing the service being loaded
private final Class<S> service;
// The class loader used to locate, load, and instantiate providers
private final ClassLoader loader;
// The access control context taken when the ServiceLoader is created
private final AccessControlContext acc;
// Cached providers, in instantiation order
private LinkedHashMap<String,S> providers = new LinkedHashMap<>();
// The current lazy-lookup iterator
private LazyIterator lookupIterator;
ServiceLoader通过LazyIterator 的ClassLoader加载文件。
Enumeration<URL> configs = ClassLoader.getSystemResources(fullName);
ServiceLoader通过LazyIterator 的ClassLoader加载class。
Class<?> c = Class.forName(cn, false, loader);
SPI的全名为Service Provider Interface,为某个接口寻找服务实现的机制。
当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。通过这个约定,就不需要把服务放在代码中了,通过模块被装配的时候就可以发现服务类了。
企业级spring-boot案例
|----Spring Boot整合actuator,实现服务监控管理 spring-boot-actuator
|----Spring Boot集成事件发布及监听 spring-boot-applicationevent
|----Spring Boot整合异步线程池 spring-boot-async
|----Spring Boot整合自定义banner spring-boot-banner
|----Spring Boot整合本地缓存caffeine spring-boot-cache-caffeine
|----Spring Boot整合验证码captcha spring-boot-captcha
|----Spring Boot整合cors跨域资源共享 spring-boot-cors
|----Spring Boot整合自定义Starter spring-boot-custom-starter
|----Spring Boot整合Elasticsearch spring-boot-data-elasticsearch
|----Spring Boot整合jpa实现增删改查 spring-boot-data-jpa
|----Spring Boot整合PostgreSQL spring-boot-data-postgresql
|----Spring Boot整合Redis spring-boot-data-redis
|----Spring Boot整合Docker spring-boot-docker
|----Spring Boot整合Druid数据库连接池 spring-boot-druid
|----Spring Boot整合dubbo spring-boot-dubbo
|----Spring Boot整合动态kafka消费者 spring-boot-dynamic-kafka-consumer
|----Spring Boot整合EasyExcel,实现Excel导入导出 spring-boot-easyexcel
|----Spring Boot整合邮件发送 spring-boot-email
|----Spring Boot枚举案例 spring-boot-enum
|----Spring Boot整合全局异常处理,接口统一响应对象 spring-boot-exception-handler
|----Spring Boot设计模式之工厂方法模式 spring-boot-factory-method
|----Spring Boot整合文件上传 spring-boot-file-upload
|----Spring Boot整合flyway,数据库版本控制 spring-boot-flyway
|----Spring Boot整合git插件,将项目打包为tar.gz,并带上git版本号,然后通过sh脚本快速部署 spring-boot-git-commit-id-plugin
|----Spring Boot快速入门-HelloWorld spring-boot-helloworld
|----Spring Boot整合HikariCP数据库连接池 spring-boot-hikaricp
|----Spring Boot整合https spring-boot-https
|----Spring Boot整合Jackson,实现数据脱敏 spring-boot-json-desensitization
|----Spring Boot整合Kafka spring-boot-kafka
|----Spring Boot整合Knife4j-API接口文档 spring-boot-knife4j
|----Spring Boot整合log4j2日志 spring-boot-log4j2
|----Spring Boot整合logback日志 spring-boot-logback
|----Spring Boot整合Maven Archetype模板工程-单模块 spring-boot-maven-archetype-single-module
|----Spring Boot整合MyBatis spring-boot-mybatis
|----Spring Boot整合MyBatis,使用注解方式 spring-boot-mybatis-annotation
|----Spring Boot整合MyBatis逆向工程 spring-boot-mybatis-generator
|----Spring Boot整合通用mapper spring-boot-mybatis-mapper
|----Spring Boot整合MyBatis多数据源 spring-boot-mybatis-multi-datasource
|----Spring Boot整合MyBatis,使用pagehelper进行分页 spring-boot-mybatis-pagehelper
|----Spring Boot整合MyBatis脱敏插件,实现手机号等信息脱敏 spring-boot-mybatis-plugin-sensitive
|----Spring Boot整合Mybatis-Plus spring-boot-mybatis-plus
|----Spring Boot整合mybatis-plus动态数据源,直接使用自定义jdbcTemplate解决事务和多线程等存在的问题 spring-boot-mybatis-plus-dynamic-jdbctemplate
|----Spring Boot整合MyBatis Plus代码生成器 spring-boot-mybatis-plus-generator
|----Spring Boot整合MyBatis Plus多数据源 spring-boot-mybatis-plus-multi-datasource
|----Spring Boot整合pf4j,进行插件式编程拓展 spring-boot-pf4j
|----Spring Boot加载配置文件 spring-boot-properties
|----Spring Boot整合接口限流-guava单体方式 spring-boot-ratelimit-guava
|----Spring Boot整合接口限流-redis集群方式 spring-boot-ratelimit-redis
|----Spring Boot整合RestTemplate,实现服务间调用 spring-boot-resttemplate
|----Spring Boot整合retrofit,支持通过接口的方式发起HTTP请求 spring-boot-retrofit
|----Spring Boot整合spring-retry实现请求失败自动重试 spring-boot-retry
|----Spring Boot启动时的运行方法 spring-boot-runner
|----Spring Boot整合定时任务scheduler spring-boot-scheduler
|----Spring Boot整合Screw,一键生成数据库文档 spring-boot-screw
|----Spring Boot整合Shiro spring-boot-shiro
|----Spring Boot设计模式之工厂模式 spring-boot-simple-factory
|----Spring Boot整合Swagger3-API接口文档 spring-boot-swagger3
|----Spring Boot整合模板引擎Thymeleaf spring-boot-thymeleaf
|----Spring Boot整合undertow spring-boot-undertow
|----Spring Boot整合Validator数据校验 spring-boot-validator
|----Spring Boot项目打包成war包 spring-boot-war
|----Spring Boot整合zip,压缩和解压文件 spring-boot-zip
starter包的内容就是pom文件,就是一个依赖传递包。 帮我们封装好了所有需要的依赖,避免我们自己添加导致的一些Jar包冲突或者缺少包的情况.这些Starters作为Spring相关技术的引导过程,我们 不再需要担心依赖关系,它们将由Spring Boot Starters自动管理。
autoconfigure就是帮我们自动把bean注入到IOC容器中。
actuator是Spring Boot的监控插件,本身提供了很多接口可以获取当前项目的各项运行状态指标。
我们用的比较少,所以就不多赘述了。个人感觉比较好用的功能就是命令行直接执行groovy脚本了。
Actuator端点可以监控应用程序并与之交互。Spring Boot包括许多内置的端点,比如health端点提供基本的应用程序运行状况信息,并允许添加自定义端点。可以控制每个单独的端点启用或禁用,也可以通过include和exclude属性通配,这会影响端点的Bean创建。这会影响端点的Bean创建。要远程访问端点,还必须通过JMX或HTTP公开。大多数应用程序选择HTTP,其中/actuator前缀和端点的ID组成了对外暴露的URL。比如默认情况下,health端点映射到/actuator/health。
第一部分:进行SpringApplication的初始化模块,配置一些基本的环境变量、资源、构造器、监听器
第二部分:实现了应用具体的启动方案,包括启动流程的监听模块、加载配置环境模块、及核心的创建上下文环境模块
第三部分:是自动化配置模块,该模块作为springboot自动配置核心,在后面的分析中会详细讨论
tomcat启动时会加载和解析web.xml文件,获取其中配置的filter,servlet,listener等设置到context中后,接下来就是执行了。执行到配置的ContextLoaderListener时,该监听器最终会调用AbstractApplicationContext.refresh()便会启动Spring容器(具体流程可查看源码及参考文末参考链接),而通过加载DispatcherServlet,便可以将相应的web请求转发到DispatcherServlet,进而web服务便可使用Spring容器提供的服务了,其是流程上沟通二者的桥梁。
SpringBoot 启动类main方法:执行SpringApplication的SpringApplication.run()方法,在准备上下文容器ApplicationContext时,获取的实例为AnnotationConfigServletWebServerApplicationContext,其继承ServletWebServerApplicationContext,并将AbstractApplicationContext启动Spring容器的refresh方法中的onRefresh()方法重写:添加creatWebServer方法,该方法会启动tomcat容器。所以SpringBoot在加载Spring容器时启动了tomcat。
Spring发展历史
https://blog.csdn.net/tales522/article/details/117389948
Spring 版本迭代
https://blog.csdn.net/weixin_38910645/article/details/109209901
Java spi机制
https://blog.csdn.net/qq_40577332/article/details/125163990。
Springboot组件
https://blog.csdn.net/myli92/article/details/127913211
Springboot启动过程
https://blog.csdn.net/w2009211777/article/details/122606660
Spring运行方式
https://blog.csdn.net/baidu_38890653/article/details/122155495