这里构造时仅仅加载了一个EventPublishingRunListener类,所以咱们就来解析一下这个东东
通过上篇文章的学习,大概清楚了springApplication类的功能。但是遗留了几个问题是读取application.properties和loader.load()的功能。因为这两个对于后边的分析会很重要。所以还是要深入的理解。
一般情况下,我们做项目的时候,中间件例如mysql,redis, zk 的账号密码一般都是写在配置文件里面的, 这样代码泄露的情况下, 就很不安全。
org.springframework.core.env.Environment是当前应用运行环境的公开接口,主要包括应用程序运行环境的两个关键方面:配置文件(profiles)和属性。Environment继承自接口PropertyResolver,而PropertyResolver提供了属性访问的相关方法。这篇文章从源码的角度分析Environment的存储容器和加载流程,然后基于源码的理解给出一个生产级别的扩展。
在SpringBoot启动流程中,主要的两个阶段是初始化SpringApplication对象以及SpringApplication.run方法执行的内容,今天主要细讲的是SpringApplication.run中的准备环境的prepareEnvironment方法源码ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments)。prepareEnvironment的源码如下
之前一篇文章《从apollo的初始化看spring boot 1.5.3启动过程( 一)》 说到而apollo的初始化逻辑便放在这里面,本文就继续从此展开
也就是说我们手动实现这个也就可以添加环境变量, 由于是MapPropertySource , 相同的key 会覆盖。
其实就是把一些配置的信息分离于自身的系统,而这些信息又能被应用实时获取得到。这里用springboot 举例子,我们都知道springboot 启动的时候,会加载resource 目录下面的application.properties 或者 application.yml。 这个时候我们把springboot 启动的时候所需要加载的配置文件 不和工程放在一起,统一管理,这个就是分布式配置中心的核心思想。
表示当前应用系统正在运行的环境,为 profiles 和 properties 这两个重要的方面提供模型,Environment接口定义了处理profiles的相关方法,而访问property的有关方法由父接口PropertyResolver定义
对应的就是 META-INF/spring.factories 文件中的 org.springframework.boot.SpringApplicationRunListener=org.springframework.boot.context.event.EventPublishingRunListener
从Spring Boot 1.3开始,我们可以在应用程序上下文刷新之前使用EnvironmentPostProcessor来自定义应用程序的Environment。Environment表示当前应用程序运行的环境,它可以统一访问各种属性源中的属性,如属性文件、JVM系统属性、系统环境变量和Servlet上下文参数。使用EnvironmentPostProcessor可以在bean初始化之前对Environment进行修改。
上篇文章介绍了Spring源码中的三步中的super(parent)的代码,本文介绍下setConfigLocations(configLocation)方法
在《Spring Boot 框架整体启动流程详解》中,我们了解到有一步是准备环境prepareEnvironment,属性加载就是在这一步开始的。
【摘要】 简介从Spring Boot 1.3开始,我们可以在应用程序上下文刷新之前使用EnvironmentPostProcessor来自定义应用程序的Environment。Environment表示当前应用程序运行的环境,它可以统一访问各种属性源中的属性,如属性文件、JVM系统属性、系统环境变量和Servlet上下文参数。使用EnvironmentPostProcessor可以在bean初始化...
工作中对于我们java开发者来说最经常使用的框架就是spring了,那么了解spring的基础原理对于我们的能力提升具有很大的好处。首先,作为框架首先它肯定还是从java基础演变而来,也就是说框架的代码都是基于我们日常使用的继承、多态已经各种设计模式的整合而抽取出来的一套规范。我们开发项目要想搭乘spring的快车就需要按规范做事,按规范开发。那么规范的熟悉程度就等价于项目质量的高低。当然框架的基础都是好的idea,好的idea不仅兼容一切还简单。这就和物理界的大一统理论一样。怎么做不重要,重要的是怎么兼容一切,因为做的办法会有无限种。实在无法实现也可以同缩小解的范围。废话不说了。让我们开启spring的流浪之旅。
Spring Boot 有多种加载自定义初始化器的方法: 1、创建一个实现ApplicationContextInitializer接口的类,在spring.factories中添加,如MyInitializer 2、创建一个实现ApplicationContextInitializer接口的类,在SpringApplication 中使用addInitializers添加,如MyInitializer2 3、创建一个实现ApplicationContextInitializer接口的类,在application.yml或application.properties中使用context.initializer.classes添加,如MyInitializer3 4、创建一个实现EnvironmentPostProcessor接口的类,在spring.factories中添加,如MyEnvironmentPostProcessor
图1
调用SpringApplication.java 中的 run 方法,目的是加载Spring Application,同时返回 ApplicationContext。
在前面文章中,我们聊过SpringBoot是如何解决依赖配置,以及如何实现自动装配的。今天我们继续来聊Springboot的启动流程。
几个重要的事件回调机制 ApplicationContextInitializer ApplicationContextInitializer来源于Spring框架 主要作用就是在ConfigurableApplicationContext类型或者子类型的ApplicationContext做refresh之前 允许对ConfigurableApplicationContext的实例做进一步的设置和处理 ApplicationContextInitializer接口: 是在Spring容器刷新之前执行的
SpringBoot启动的时候 listeners.starting() ;接下来就是准备环境的过程
在介绍Spring核心模块为运行环境管理提供的功能之前,咱们先得解释清楚“运行环境”是什么。
找到本地maven库,替换E:\.m2\repository\org\springframework下的所有文件 即可。
本文主要研究一下springboot的EnvironmentPostProcessor
本章是学习spring4.1.8初始化源码的第二篇,前一章《spring4.1.8初始化源码学习三部曲之一:AbstractApplicationContext构造方法》对AbstractApplicationContext的初始化做了分析,本章我们聚焦ClassPathXmlApplicationContext.setConfigLocations方法;
BeanDefinitionRegistryPostProcessork可以在加载到项目中的beanDefinition之后执行,提供一个补充的扩展点。
首先贴一张很不错的图,SpringBoot启动结构图,图片出自SpringBoot启动流程解析。 本文的分析基于Spring Boot 2.1.5,非Spring的代码只有下面这个启动main函数:
此系列是针对springboot的启动,旨在于和大家一起来看看springboot启动的过程中到底做了一些什么事。如果大家对springboot的源码有所研究,可以挑些自己感兴趣或者对自己有帮助的看;但是如果大家没有研究过springboot的源码,不知道springboot在启动过程中做了些什么,那么我建议大家从头开始一篇一篇按顺序读该系列,不至于从中途插入,看的有些懵懂。当然,文中讲的不对的地方也欢迎大家指出,有待改善的地方也希望大家不吝赐教。老规矩:一周至少一更,中途会不定期的更新一些其他的博客,可能是springboot的源码,也可能是其他的源码解析,也有可能是其他的。
Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEvent
上篇《Spring Boot 2.x 启动全过程源码分析(一)入口类剖析》我们分析了 Spring Boot 入口类 SpringApplication 的源码,并知道了其构造原理,这篇我们继续往下面分析其核心 run 方法。
大家是否都用过System.getProperties.getPropertite(“os.name”),获取过登入系统,这篇文章就看Conditional注解源码,如何获取系统信息。
上篇文章介绍了BeanPostProcessor,spring框架生命周期@PostConstruct,@PreDestroy,InitializingBean,disposableBean接口,依赖注入@Autowird都离不开这个接口,@Bean等对象的注入,在bean对象初始化前后还可以调用方法执行事务,对此接口源码也做了深入的了解,在对bean初始化之前,会调用方法先对bean注入属性赋值 ,感兴趣的可以点进去看看:
Spring框架提供了多profile的管理功能,我们可以使用profile功能来区分不同环境的配置。
SpringApplication运行阶段围绕run(String …)方法展开,该过程结合初始化阶段完成的状态进一步完善了运行时所需要准备的资源,随后启动Spring应用上下文,在此期间伴随Spring Boot和Spring事件的触发,形成完整的SpringApplication生命周期:
继续,重点是invokeListener方法,去调用监听器事件,可以想象对配置文件来讲,这就是读取配置事件了。同时监听器有很多,读取配置文件的监听器是ConfigFileAplicationListener,看名字还是蛮明显的吧
Spring读源码系列番外篇—02—PropertyResolver的结构体系剖析—上
从上面代码看,调用了SpringApplication的静态方法run。这个run方法会构造一个SpringApplication的实例,然后再调用这里实例的run方法就表示启动SpringBoot。具体对象处理流程看下边时序图:
通常企业级的Spring应用会提供几套部署环境,用于各个阶段的功能检验,比如:"dev"代表开发环境,"staging"表示预发环境,"prod"表示生产环境。对于同一个应用,在不同环境中所依赖的资源或表现行为可能存在差异。Spring Framework使用运行时配置来解决。
SpringBoot项目的启动流程是很多面试官面试中高级Java程序员喜欢问的问题。这个问题的答案涉及到了SpringBoot工程中的源码,也许我们之前看过别的大牛写过的有关SpringBoot项目启动流程的文章,但是自己没有去研究一遍总是会记忆不深刻。有句话叫做“纸上来得终觉浅,绝知此事要躬行”,我觉得说得非常在理。底层的东西,也只有自己深入研究过一遍甚至好几遍源码才能彻底搞懂并记忆牢固。下面笔者来带领大家详细分析SpringBoot启动过程中到底做了哪些事情,把本文仔细看完了,面对面试官问的有关SpringBoot启动过程做了哪些工作的面试题就迎刃而解了!
在我刚入行不久时,总是对上下文(Context)、环境(Environment)这类抽象概念搞不清楚、弄不明白、玩不转,更是不懂它哥俩的区别或者说是联系(说实话从中文上来说不好区分,至少我是这么认为的)。 直到现在,我可以根据自己的理解对这两者下个通俗易懂的定义(不喜勿喷):
Spring抽象了一个environment表示Spring应用程序环境配置,整合了各种各样的外部环境,并提供统一访问的方法getProperty()
上一篇文章中,我们简单了解了一下SpringApplication的run方法的代码逻辑。
return new SpringApplication(primarySources).run(args); 这篇文章咱么说下run()方法开始之后都做了那些事情。 继续往下跟着源码进入到run()这个是比较核心的一个方法了
org/springframework/boot/context/event/SpringApplicationEvent.java
SpringBoot系列之启动成功后执行业务逻辑。在Springboot项目中经常会遇到需要在项目启动成功后,加一些业务逻辑的,比如缓存的预处理,配置参数的加载等等场景,下面给出一些常有的方法
从配置文件中获取属性应该是SpringBoot开发中最为常用的功能之一,但就是这么常用的功能,仍然有很多开发者在这个方面踩坑。
上文聊了 SpringBoot中SpringApplication是如何构建的(《SpringBoot启动流程二》:七千字源码分析SpringApplication构造阶段)?从这篇文章开始,进入到SpringApplication的运行阶段(核心过程),我们分三个部分来讨论,分别为:SpringApplication准备阶段、ApplicationContext启动阶段、ApplicationContext启动后阶段。
nacos-spring-boot-project/nacos-config-spring-boot-autoconfigure/src/main/java/com/alibaba/boot/nacos/config/autoconfigure/NacosConfigEnvironmentProcessor.java
领取专属 10元无门槛券
手把手带您无忧上云