参考:
fhfirehuo: SpringBoot的启动流程
- Spring 框架就像一个家族,有众多衍生产品例如 boot、security、jpa等等;但他们的基础都是Spring 的ioc和 aop,ioc 提供了依赖注入的容器, aop解决了面向切面编程,然后在此两者的基础上实现了其他延伸产品的高级功能。
- Spring MVC提供了一种轻度耦合的方式来开发web应用;它是Spring的一个模块,是一个web框架;通过DispatcherServlet, ModelAndView 和 View Resolver,开发web应用变得很容易;解决的问题领域是网站应用程序或者服务开发——URL路由、Session、模板引擎、静态Web资源等等。
- Spring Boot实现了auto-configuration自动配置(另外三大神器actuator监控,cli命令行接口,starter依赖),降低了项目搭建的复杂度。它主要是为了解决使用Spring框架需要进行大量的配置太麻烦的问题,所以它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具;同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box)。
在其中比较重要的有三个注解,它们三个可以用一个 @SpringBootApplication 替代:
- @SpringBootConfiguration:继承了Configuration,表示当前是注解类
- @EnableAutoConfiguration :启用或禁用 Spring Boot 自动配置。
- @ComponentScan:扫描路径设置(具体使用待确认)
例如,这两个代码块都会导致类似的行为:
SpringBoot 类,继承自 SpringBootServletInitializer
package com.ztesoft.zsmart.bss.ucc.mmgw; import com.ztesoft.zsmart.core.log.ZSmartLogger; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; @EnableScheduling @EnableAsync @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class BootApplication extends SpringBootServletInitializer { private static Logger logger = Logger.getLogger(BootApplication.class); public static void main(String[] args) throws Exception { System.out.println("---start---"); logger.info("---start---"); try { SpringApplication.run(BootApplication.class, args); } catch (Exception e) { e.printStackTrace(); logger.warn("mmgw start exeception", e); } System.out.println("---start end---"); logger.info("---start end---"); } }
SpringApplication 构造方法
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { this.sources = new LinkedHashSet(); this.bannerMode = Mode.CONSOLE; this.logStartupInfo = true; this.addCommandLineProperties = true; this.addConversionService = true; this.headless = true; this.registerShutdownHook = true; this.additionalProfiles = new HashSet(); this.isCustomEnvironment = false; this.resourceLoader = resourceLoader; Assert.notNull(primarySources, "PrimarySources must not be null");
// 主启动类,放到 Set 里。其实就是一个有 @SpringbootApplication 的启动类 this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
// 确定项目的启动类型。springboot1.5 只有两种类型web环境和非web环境,springboot2.0 有三种类型
// NONE:不需要在web容器环境下运行,也就是普通的工程
// SERVLET:基于Servlet的WEB项目
// Reactive:响应式Web应用,Spring5版本的新特性 this.webApplicationType = WebApplicationType.deduceFromClasspath();
// 实例化所有实现了 org.springframework.context.ApplicationContextInitializer 接口的类(主要方法 initialize) this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
// 实例化所有实现了 org.springframework.context.ApplicationListener 接口的类(主要方法 onApplicationEvent) this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
// main 函数所在的启动类 this.mainApplicationClass = this.deduceMainApplicationClass(); }
两个值得注意的地方,实例化了所有 ApplicationContextInitialzer 和 ApplicationListener
- org.springframework.context.ApplicationContextInitializer#initialize
- 会在 ConfigurableApplicationContext 的 refresh() 方法调用之前被调用(prepareContext方法中调用),做一些容器的初始化工作。
- org.springframework.context.ApplicationListener#onApplicationEvent
- Springboot整个生命周期在完成一些阶段的时候都会通过事件推送器(EventPublishingRunListener)产生一个事件(ApplicationEvent), 然后再遍历每个监听器(ApplicationListener)以匹配事件对象,这是一种典型的观察者设计模式。
标签:web,Springboot,启动,Spring,springframework,---,import,org From: https://www.cnblogs.com/suBlog/p/17787348.html