当前位置: 首页 > news >正文

老师找学生做网站是什么心态网站建设-应酷

老师找学生做网站是什么心态,网站建设-应酷,恒网做的网站,旅游投资公司网站建设关键词#xff1a;Spring Boot、启动流程、源码解析、IoC容器、自动配置 摘要#xff1a;本文深入分析Spring Boot的启动流程#xff0c;结合核心源码详解从run()方法到嵌入式服务器启动的每一步操作#xff0c;揭秘自动配置原理及扩展点。 一、为什么需要掌握启动流程Spring Boot、启动流程、源码解析、IoC容器、自动配置 摘要本文深入分析Spring Boot的启动流程结合核心源码详解从run()方法到嵌入式服务器启动的每一步操作揭秘自动配置原理及扩展点。 一、为什么需要掌握启动流程 Spring Boot以其约定大于配置、快速启动的特性成为Java微服务开发的首选框架。理解其启动流程能帮助我们 定制化扩展自定义启动加载过程⚡ 性能优化加速应用启动大型项目启动耗时从分钟级降到秒级 故障排查解决初始化阶段的诡异Bug 深入理解框架打通Spring Boot任督二脉 下面我们将结合源码深入剖析Spring Boot启动的每一个关键步骤。 二、启动流程总览10步图解 flowchart TBA[SpringApplication.run()] -- B[初始化SpringApplicationRunListeners]B -- C[准备环境Environment]C -- D[打印Banner]D -- E[创建ApplicationContext]E -- F[准备上下文]F -- G[刷新上下文brfont color#FF0000最核心/font]G -- H[加载自动配置]G -- I[实例化单例Bean]I -- J[启动嵌入式服务器]J -- K[发布Ready事件]三、启动流程源码级分解 步骤1: SpringApplication初始化 // 源码位置SpringApplication.java public SpringApplication(Class?... primarySources) {this.primarySources new LinkedHashSet(Arrays.asList(primarySources));this.webApplicationType WebApplicationType.deduceFromClasspath(); // 1.推断应用类型this.bootstrappers new ArrayList(getSpringFactoriesInstances(Bootstrapper.class)); setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class)); // 2.加载InitializersetListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); // 3.加载Listenerthis.mainApplicationClass deduceMainApplicationClass(); // 4.推断主类 }作用说明 推断应用类型Servlet/Reactive/None通过检测类路径是否存在 javax.servlet.Servlet和org.springframework.web.context.ConfigurableWebApplicationContext → SERVLETorg.springframework.web.reactive.DispatcherHandler → REACTIVE否则 → NONE 通过SPI机制加载META-INF/spring.factories中定义的拓展组件 步骤2: 执行run()方法 // 源码位置SpringApplication.java public ConfigurableApplicationContext run(String... args) {// 1. 启动计时器StopWatch stopWatch new StopWatch();stopWatch.start();// 2. 初始化SpringApplicationRunListenersSpringApplicationRunListeners listeners getRunListeners(args);listeners.starting(); // 发布ApplicationStartingEvent// 3. 准备环境ConfigurableEnvironment environment prepareEnvironment(listeners, applicationArguments);// 4. 打印BannerBanner printedBanner printBanner(environment);// 5. 创建ApplicationContextcontext createApplicationContext();// 6. 准备上下文prepareContext(context, environment, listeners, applicationArguments, printedBanner);// 7. 刷新上下文核心refreshContext(context);// 8. 执行RunnercallRunners(context, applicationArguments);// 9. 完成启动listeners.started(context);return context; }步骤3: 环境准备Environment private ConfigurableEnvironment prepareEnvironment(...) {// 创建环境对象Servlet环境或标准环境ConfigurableEnvironment environment getOrCreateEnvironment();// 加载配置源application.properties/ymlconfigureEnvironment(environment, applicationArguments.getSourceArgs());// 发布ApplicationEnvironmentPreparedEventlisteners.environmentPrepared(environment);// 绑定SpringApplication配置bindToSpringApplication(environment);return environment; }步骤4: 创建IoC容器 根据应用类型创建不同类型的上下文 // 源码位置SpringApplication.java protected ConfigurableApplicationContext createApplicationContext() {return this.applicationContextFactory.create(this.webApplicationType); }// 默认实现 ApplicationContextFactory DEFAULT (webApplicationType) - {switch (webApplicationType) {case SERVLET:return new AnnotationConfigServletWebServerApplicationContext();case REACTIVE:return new AnnotationConfigReactiveWebServerApplicationContext();default:return new AnnotationConfigApplicationContext();} };步骤5: 刷新上下文最核心步骤 // 源码位置SpringApplication.java private void refreshContext(ConfigurableApplicationContext context) {// 调用AbstractApplicationContext.refresh()refresh(context); }// 源码位置AbstractApplicationContext.java public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// [1] 准备刷新工作prepareRefresh();// [2] 获取新的BeanFactoryConfigurableListableBeanFactory beanFactory obtainFreshBeanFactory();// [3] 配置BeanFactory注册环境等组件prepareBeanFactory(beanFactory);try {// [4] 后处理BeanFactorypostProcessBeanFactory(beanFactory);// [5] 执行BeanFactoryPostProcessorinvokeBeanFactoryPostProcessors(beanFactory);// [6] 注册BeanPostProcessorregisterBeanPostProcessors(beanFactory);// [7] 初始化MessageSource国际化initMessageSource();// [8] 初始化事件广播器initApplicationEventMulticaster();// [9] 初始化特殊BeanonRefresh();// [10] 注册监听器registerListeners();// [11] 实例化非懒加载的单例BeanfinishBeanFactoryInitialization(beanFactory);// [12] 完成刷新finishRefresh();}} }关键子步骤自动配置生效过程 // 源码位置PostProcessorRegistrationDelegate.java public static void invokeBeanFactoryPostProcessors(...) {// 处理BeanDefinitionRegistryPostProcessorprocessConfigBeanDefinitions(registry); }private static void processConfigBeanDefinitions(...) {// 创建ConfigurationClassParser解析Configuration类parser.parse(candidates);// 加载自动配置类SetString candidates new LinkedHashSet(configCandidates);AutoConfigurationImportSelector.selectImports() // 关键方法 }自动配置选择器核心逻辑 // 源码位置AutoConfigurationImportSelector.java protected ListString getCandidateConfigurations(...) {// 从META-INF/spring.factories加载配置ListString configurations SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class, getBeanClassLoader());// 应用条件过滤ConditionalOnClass等configurations filter(configurations, autoConfigurationMetadata);return configurations; }四、关键扩展点实战 扩展点1自定义ApplicationRunner Component Order(1) // 控制执行顺序 public class CacheInitializer implements ApplicationRunner {Overridepublic void run(ApplicationArguments args) {System.out.println(初始化缓存数据...);// 实际业务逻辑} }扩展点2自定义事件监听 Component public class StartupMonitorListener implements ApplicationListenerApplicationReadyEvent {Overridepublic void onApplicationEvent(ApplicationReadyEvent event) {System.out.println(应用启动完成耗时 TimeUnit.NANOSECONDS.toMillis(event.getTimestamp()) ms);} }扩展点3自定义BeanPostProcessor Component public class CustomBeanPostProcessor implements BeanPostProcessor {Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {if(bean instanceof Controller) {System.out.println(Controller初始化完成: beanName);}return bean;} }五、性能优化实践 减少组件扫描范围 SpringBootApplication(scanBasePackages com.example.core)排除不必要的自动配置 EnableAutoConfiguration(exclude {DataSourceAutoConfiguration.class, KafkaAutoConfiguration.class })启用懒初始化慎用 spring.main.lazy-initializationtrue关闭JMX监控节省30-50ms spring.jmx.enabledfalse六、常见面试题 Q1: SpringBootApplication注解做了哪些事 A: 该注解是三个核心注解的组合 SpringBootConfiguration标识为配置类EnableAutoConfiguration启用自动配置ComponentScan组件扫描默认当前包 Q2: 自动配置是如何实现的 A: 通过EnableAutoConfiguration引入AutoConfigurationImportSelector该选择器 从META-INF/spring.factories加载配置类过滤掉缺少依赖的配置通过ConditionalOnClass等条件注解应用排序规则 Q3: 如何加速Spring Boot启动 优化方案 减小ComponentScan范围排除不必要的自动配置使用Lazy延迟初始化关闭JMX、actuator等非必要模块 七、总结 Spring Boot的启动过程本质上是IoC容器的初始化过程核心亮点在于 事件驱动架构通过11种启动事件解耦各阶段条件化自动配置按需加载超过300自动配置类嵌入式容器无缝集成Tomcat/Jetty等服务器SPI扩展机制通过spring.factories实现插件化 掌握启动流程后你可以 定制自己的启动初始化逻辑解决Bean初始化顺序问题实现秒级启动的微服务深度优化Spring Boot应用
http://www.w-s-a.com/news/172136/

相关文章:

  • 建站特别慢wordpress网页制作与设计项目策划书
  • 视频制作素材免费网站头像制作在线生成器
  • 网站建设是不是可以免费建站广州做网站 信科网络
  • 闸北区网站设计叫别人做网站后怎么更改密码
  • 为什么想做网站运营建设工程教育网站
  • 站长基地百度推广整体优化网站
  • 门窗 东莞网站建设wordpress外链论坛
  • 安徽省建设部网站官网还能用的wap网站
  • 企业网站设计开发网站关键词优化seo
  • 郑州高档网站建设台州网站建设推广
  • 广东省建设信息港网站WordPress手机缩略图设置
  • 优秀网站主题平顶山专业做网站公司
  • wordpress返回顶部插件wordpress站群seo
  • 企业网站建设报价表百度竞价托管哪家好
  • 织梦网站首页打开慢淄博网站推广那家好
  • 苏州高端网站建设kgwl互动网站建设的主页
  • 宿州网站建设哪家公司好个人网站制作方法
  • 网站正能量晚上在线观看视频站长之家关键词挖掘工具
  • 建设网站怎么判断是电脑还是手机仿租号网站源码网站开发
  • seo百度网站排名软件重庆巫山网站设计公司
  • 搭建视频播放网站网站排名诊断
  • 网站域名注册网站centos做网站服务器
  • 网站服务器共享的 vpsh5页面制作软件电脑版
  • 免费手机网站申请上海网站建设设计公司哪家好
  • 站长工具大全企业网上书店网站建设设计
  • 做网站的专业公司公司网站是做的谷歌的
  • 做网站前期工作wordpress图片并排
  • 免费注册网站哪个好wordpress评论修改
  • 合肥模板网站建设软件赤峰公司网站建设
  • 毕业设计都是做网站吗深圳网站制作企业邮箱