SpringBoot杂记

启动


入口

@SpringBootApplication
public class XlcqqApplication {
	public static void main(String[] args) {
		SpringApplication.run(XlcqqApplication.class, args);
	}
}

整个项目将从SpringApplication.run()这个关键方法启动,SpringApplication是引导SpringBoot启动的一个工具类,这个类提供的run()是一个关键方法,其中最重要的功能就是创建spring的context

创建SpringContext

run()源码片段如下

try {
			......
			context = createApplicationContext();
			......
			prepareContext(context, environment, listeners, applicationArguments,
					printedBanner);
			refreshContext(context);
			......
		}

可见就是调用了createApplicationContext()来创建context的,进入createApplicationContext方法:

Class<?> contextClass = this.applicationContextClass;
		if (contextClass == null) {
			try {
				switch (this.webApplicationType) {
				case SERVLET:
					contextClass = Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS);
					break;
				case REACTIVE:
					contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS);
					break;
				default:
					contextClass = Class.forName(DEFAULT_CONTEXT_CLASS);
				}
			}

会发现SpringBoot将根据webApplicationType属性来创建对应的context实例,预定义的两个实例class为

	public static final String DEFAULT_SERVLET_WEB_CONTEXT_CLASS = "org.springframework.boot."
			+ "web.servlet.context.AnnotationConfigServletWebServerApplicationContext";


	public static final String DEFAULT_REACTIVE_WEB_CONTEXT_CLASS = "org.springframework."
			+ "boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext";

至此,便知道SpringBoot启动Spring其实就只是根据当前环境,创建了AnnotationConfigServletWebServerApplicationContext或者AnnotationConfigReactiveWebServerApplicationContext二者之一来作为Spring的context。

加载Spring的Bean

在上面的run()方法中,创建了spring context之后,接着要加载bean,这是在第二步 prepareContext()中完成的。源码如下:

private void prepareContext(ConfigurableApplicationContext context,
			ConfigurableEnvironment environment, SpringApplicationRunListeners listeners,
			ApplicationArguments applicationArguments, Banner printedBanner) {
		context.setEnvironment(environment);
		...... //一系列准备工作
		load(context, sources.toArray(new Object[0]));
		listeners.contextLoaded(context);
	}

上面的方法中,最后用调用了load()这个方法,进入load()

protected void load(ApplicationContext context, Object[] sources) {
		if (logger.isDebugEnabled()) {
			logger.debug(
					"Loading source " + StringUtils.arrayToCommaDelimitedString(sources));
		}
		BeanDefinitionLoader loader = createBeanDefinitionLoader(
				getBeanDefinitionRegistry(context), sources);
		if (this.beanNameGenerator != null) {
			loader.setBeanNameGenerator(this.beanNameGenerator);
		}
		if (this.resourceLoader != null) {
			loader.setResourceLoader(this.resourceLoader);
		}
		if (this.environment != null) {
			loader.setEnvironment(this.environment);
		}
		loader.load();
	}

这个方法中,创建了一个 BeanDefinitionLoader的实例loader,而这个loader,就是spring中用来加载bean的loader,从这里开始,后续也就是在执行spring原有的加载bean的一系列功能了。

小结:

对于以上SpringBoot启动的三步总结如下:

  1. 首先SpringBoot的入口main函数中,调用了SpringApplication.run()方法,这个方法主要用途是创建一个spring context实例
  2. 在run()中,将根据当前项目环境,创建一个对应的spring context
  3. 创建了srping context之后,会委托spring原有的BeanDefinitionLoader来加载bean

以上是SpringBoot启动的主要步骤,但是非常粗略,其中还涉及到非常多的事情,例如一个starter是如何做到自动配置启动的,Spring WEB启动的时候是如何自动启动tomcat的等等。

 

内容概要:本文档为《【顶刊复现】配电网两阶段鲁棒故障恢复研究(Matlab代码实现)》的技术资料汇总,聚焦电力系统中配电网在故障条件下的快速恢复问题,提出一种基于两阶段鲁棒优化的故障恢复模型。该模型在第一阶段制定预恢复策略,在第二阶段根据实际不确定性(如负荷波动、分布式电源出力波动)进行动态调整,从而增强系统应对突发故障的鲁棒性与恢复能力。研究完整实现了Matlab代码仿真,并融合Benders分解、混合整数线性规划(MILP)建模及YALMIP工具包调用等关键技术,具备较强的工程复现价值。文档还附带多个前沿科研方向资源,涵盖微电网优化、储能配置、电动汽车调度、风光制氢合成氨系统、无人机路径规划及机器学习预测等领域,形成综合性科研支持体系。所有资源通过指定网盘链接与微信公众号统一提供。; 适合人群:具备电力系统、自动化、电气工程或相关专业背景,熟悉Matlab/Simulink仿真环境,有一定优化算法基础的研究生、科研人员及工程技术人员。; 使用场景及目标:① 学习并复现顶刊级别的配电网故障恢复优化模型;② 掌握两阶段鲁棒优化在电力系统不确定性建模中的应用方法;③ 深入理解Benders分解、MILP建模、YALMIP工具包调用等核心技术;④ 拓展至微电网调度、综合能源系统优化、储能配置等相关课题的研究与仿真。; 阅读建议:建议读者结合文档中提供的网盘资源与代码实例,按主题分类系统学习,优先掌握两阶段鲁棒优化的核心建模思路,并借助Matlab平台动手实践,调试代码以加深对算法流程与参数设置的理解。同时可参考文中列出的同类研究方向,拓展科研视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值