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

SprintBoot 2 源码阅读

先上菜单,核心方法

    public ConfigurableApplicationContext run(String... args) {StopWatch stopWatch = new StopWatch();stopWatch.start();DefaultBootstrapContext bootstrapContext = this.createBootstrapContext();ConfigurableApplicationContext context = null;this.configureHeadlessProperty();// 获取监听器SpringApplicationRunListeners listeners = this.getRunListeners(args);// 启动监听listeners.starting(bootstrapContext, this.mainApplicationClass);Throwable ex;try {ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments);this.configureIgnoreBeanInfo(environment);Banner printedBanner = this.printBanner(environment);// 创建 容器context = this.createApplicationContext();context.setApplicationStartup(this.applicationStartup);// 准备容器this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);// 刷新容器this.refreshContext(context);this.afterRefresh(context, applicationArguments);stopWatch.stop();if (this.logStartupInfo) {(new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);}listeners.started(context);this.callRunners(context, applicationArguments);} catch (Throwable var10) {ex = var10;this.handleRunFailure(context, ex, listeners);throw new IllegalStateException(ex);}try {listeners.running(context);return context;} catch (Throwable var9) {ex = var9;this.handleRunFailure(context, ex, (SpringApplicationRunListeners)null);throw new IllegalStateException(ex);}}

先来看看怎么获取监听器

SpringApplicationRunListeners listeners = this.getRunListeners(args);private SpringApplicationRunListeners getRunListeners(String[] args) {Class<?>[] types = new Class[]{SpringApplication.class, String[].class};return new SpringApplicationRunListeners(logger, this.getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args), this.applicationStartup);}private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) {ClassLoader classLoader = this.getClassLoader();Set<String> names = new LinkedHashSet(SpringFactoriesLoader.loadFactoryNames(type, classLoader));List<T> instances = this.createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names);AnnotationAwareOrderComparator.sort(instances);return instances;}public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {ClassLoader classLoaderToUse = classLoader;if (classLoaderToUse == null) {classLoaderToUse = SpringFactoriesLoader.class.getClassLoader();}String factoryTypeName = factoryType.getName();return (List)loadSpringFactories(classLoaderToUse).getOrDefault(factoryTypeName, Collections.emptyList());}// 核心private static Map<String, List<String>> loadSpringFactories(ClassLoader classLoader) {Map<String, List<String>> result = (Map)cache.get(classLoader);if (result != null) {return result;} else {Map<String, List<String>> result = new HashMap();try {Enumeration<URL> urls = classLoader.getResources("META-INF/spring.factories");while(urls.hasMoreElements()) {URL url = (URL)urls.nextElement();UrlResource resource = new UrlResource(url);Properties properties = PropertiesLoaderUtils.loadProperties(resource);Iterator var6 = properties.entrySet().iterator();while(var6.hasNext()) {Map.Entry<?, ?> entry = (Map.Entry)var6.next();String factoryTypeName = ((String)entry.getKey()).trim();String[] factoryImplementationNames = StringUtils.commaDelimitedListToStringArray((String)entry.getValue());String[] var10 = factoryImplementationNames;int var11 = factoryImplementationNames.length;for(int var12 = 0; var12 < var11; ++var12) {String factoryImplementationName = var10[var12];((List)result.computeIfAbsent(factoryTypeName, (key) -> {return new ArrayList();})).add(factoryImplementationName.trim());}}}result.replaceAll((factoryType, implementations) -> {return (List)implementations.stream().distinct().collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));});cache.put(classLoader, result);return result;} catch (IOException var14) {IOException ex = var14;throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", ex);}}}//获取到META-INF/spring.factories这个配置文件下的资源名称列表以后,通过createSpringFactoriesInstances函数创建了SpringFactories的实例。private <T> List<T> createSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, ClassLoader classLoader, Object[] args, Set<String> names) {List<T> instances = new ArrayList(names.size());Iterator var7 = names.iterator();while(var7.hasNext()) {String name = (String)var7.next();try {Class<?> instanceClass = ClassUtils.forName(name, classLoader);Assert.isAssignable(type, instanceClass);Constructor<?> constructor = instanceClass.getDeclaredConstructor(parameterTypes);T instance = BeanUtils.instantiateClass(constructor, args);instances.add(instance);} catch (Throwable var12) {Throwable ex = var12;throw new IllegalArgumentException("Cannot instantiate " + type + " : " + name, ex);}}return instances;}

加载这个目录下面的所有类,然后找到监听器

再看启动监听器做了什么,我们先大概地看一下EventPublishingRunListener里面的starting的实现

 listeners.starting(bootstrapContext, this.mainApplicationClass);
   public void multicastEvent(ApplicationEvent event, @Nullable ResolvableType eventType) {ResolvableType type = eventType != null ? eventType : this.resolveDefaultEventType(event);Executor executor = this.getTaskExecutor();Iterator var5 = this.getApplicationListeners(event, type).iterator();while(var5.hasNext()) {ApplicationListener<?> listener = (ApplicationListener)var5.next();if (executor != null) {executor.execute(() -> {this.invokeListener(listener, event);});} else {this.invokeListener(listener, event);}}}protected void invokeListener(ApplicationListener<?> listener, ApplicationEvent event) {ErrorHandler errorHandler = this.getErrorHandler();if (errorHandler != null) {try {this.doInvokeListener(listener, event);} catch (Throwable var5) {Throwable err = var5;errorHandler.handleError(err);}} else {this.doInvokeListener(listener, event);}}

在上面代码中我们看到,starting就是拿到META-INF/spring.factories中定义的资源的实例以后,然后再创建一个线程去启动起来

http://www.xdnf.cn/news/18379.html

相关文章:

  • Thunderbird 将推出在德国托管的加密电子邮件服务
  • 浏览器插件优化工具:bypass paywalls chrome
  • 力扣热题之贪心算法
  • Python 办公自动化实战:Excel 批量处理 + 自动发邮件
  • VsCode 上的Opencv(C++)环境配置(Linux)
  • 51单片机-中断系统
  • Ansys Motor-CAD:概述(EMag、THERM、LAB、MECH)
  • 171-基于Flask的笔记本电脑数据可视化分析系统
  • Linux数字列排序命令
  • Apache Ozone 介绍与部署使用(最新版2.0.0)
  • 大数据毕业设计推荐:基于Hadoop+Spark的手机信息分析系统完整方案
  • Matrix-Zero:昆仑万维发布的AI世界模型,支持单张图生成3D世界
  • 微信小程序,事件总线(Event Bus) 实现
  • 不同类型代理 IP 在爬虫场景下的表现对比
  • 05 ODS层(Operation Data Store)
  • 集成电路学习:什么是Camera Calibration相机标定
  • 【自用】JavaSE--网络通信
  • 电脑芯片其实更偏向MPU不是CPU,GPU CPU NPU MPU MCU的区别
  • 近端策略优化算法PPO的核心概念和PyTorch实现详解
  • ElasticSearch——常用命令
  • 数据结构-HashSet
  • Android auncher3实现简单的负一屏功能
  • 基于SpringBoot的宠物用品系统【2026最新】
  • Android面试指南(四)
  • AI研究引擎的简单技术实现步骤
  • [软件开发技术栈]从MVVM到MVC
  • 机器学习5
  • Linux入门DAY29
  • (19)python复杂度计算:在线AI(时间复杂)和本地工具(圈复杂度)
  • 什么是Qoder?如何下载?如何体验?Qoder和其他 AI IDE 什么区别?