Skip to main content

moregeek program

聊聊springboot的启动方法_周杰伦本人的博客-多极客编程

@[TOC]


聊聊SpringBoot的启动方法


SpringBootApplication注解组成


我们了解到SpringBootApplication注解下有三个注解组成:


@SpringBootConfiguration:注解中有@Configuration,被修饰的类添加到IOC容器中


@EnableAutoConfiguration:



  • @AutoConfigurationPackage:定义自动扫描的包
  • @Import({AutoConfigurationImportSelector.class}:META-INF/spring.factories定义的bean添加到IOC容器中

@ComponentScan:包扫描


那么我们今天看一下SpringBootApplication的run()方法是怎么初始化的,


关键代码:


new SpringApplication(primarySources).run(args);

构造SpringApplication对象


primarySources就是我们的项目启动主类


也就是先进行实例化SpringApplication类,然后调用它的run()方法


构造方法中对属性填充,具体是设置项目启动类,设置应用类型,设置初始化器,也就是ApplicationContextInitializer的实现类,设置监听器,也就是ApplicationListener的实现类,设置mainApplicationClass属性,也就是启动类了


这里都用到了getSpringFactoriesInstances()方法进行加载类实例,方法中加载META-INF/spring.factories下的类名的数组,然后根据定义的类名数组进行实例化,最后对实例化对象进行排序并返回实例化对象集合


run()方法的具体逻辑


实例化完SpringApplication类后就进行run()方法的调用了,具体业务逻辑:



  1. 获取监听类SpringApplicationRunListeners,并启动
  2. 创建ApplicationArguments对象,用到的参数args就是启动main()的时候定义的参数,例如端口号等等
  3. 调用prepareEnvironment()创建ConfigurableEnvironment对象
  4. 创建Banner对象,Banner就是用于输出到控制台的Banner图案
  5. 创建Spring容器
  6. 调用getSpringFactoriesInstances()方法获取异常报告类
  7. 调用prepareContext()方法,具体设置容器的环境,设置应用上下文类的类加载器和资源加载器,应用ApplicationContextInitializer类,触发SpringApplicationRunListeners类的contextPrepared()方法,注册启动参数Bean实例,将启动类注入到Spring容器中
  8. 刷新容器
  9. 刷新容器后调用的方法
  10. 停止启动统计时长,打印启动时长的日志信息
  11. 发送结束执行的事件通知
  12. 调用ApplicationRunner和CommandLineRunner的实例的run()方法,这些类的run()只在服务启动的时候调用一次
  13. 执行SpringApplicationRunListeners的running()方法,这样项目就启动了
  14. 返回context对象

总结


SpringBootApplication的run()方法中的内容还是比较多的,主要分为实例化SpringApplication对象和执行它的run()方法,run()方法中步骤很多,主要是将启动类加入容器中,方便自动配置

©著作权归作者所有:来自51CTO博客作者周杰伦本人的原创作品,请联系作者获取转载授权,否则将追究法律责任

悲观锁和乐观锁的区别以及实现方式_浅羽技术的博客-多极客编程

悲观锁 在数据库中,悲观锁的流程如下: 在对任意记录进行修改前,先尝试为该记录加上排他锁(exclusive locking)。 如果加锁失败,说明该记录正在被修改,那么当前查询可能要等待或者抛出异常。 具体响应方式由开发者根据实际需要决定。 如果成功加锁,那么就可以对记录做修改,事务完成后就会解锁了。 其间如果有其他对该记录做修改或加排他锁的操作,都会等待我们解锁或直接抛出异常。 MySQL I

我是一个垃圾_蝉沐风的博客-多极客编程

哒哒哒...... 回收者的脚步声越来越清晰,我竭力锁紧身体让自己别那么引人注目,尽管气喘吁吁,但我仍然压抑住自己的呼吸。 终归是藏不住的,但是多活个几毫秒也是好的,我们都这么想。 因为回收者是来杀我们的。 第0回 我是一个垃圾 我是一个垃圾,至少我的主人是这么喊我的。 我不知道自己做错了什么,甚至不知道自己做了什么。 我只是被他创造了出来,然后被挪来挪去,我的一生都在漂泊。 听说C帝国的朋友都是

导入excel hutool工具_wx6237f50e82bc0的博客-多极客编程

第一步 : 导包(需要注意这里包的版本号有很大问题需要注意 !!!)<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.0</version>

聊聊mybatis的延迟加载_周杰伦本人的博客-多极客编程

@[TOC] 聊聊Mybatis的延迟加载 延迟加载就是在需要的数据的时候再进行加载,也就是懒加载,延迟加载是基于嵌套查询来实现的,一般在一对多,多对多的时候使用延迟加载,一对一或者多对一的时候使用立即加载 全局延迟加载 全局延迟加载: 在settings标签下配置lazyLoadingEnabled属性: <settings> <setting name="lazyLoad

javaweb实战之response重定向运用以及原理详解_上进小菜猪的博客-多极客编程

@[toc] 一.实现重定向 重定向是一个非常广泛的概念,即通过各种方法将各种网络请求重定向到其他位置,如网页重定向、域名重定向、数据包重定向等。 如上图,A为客户端,A向服务端B请求一个资源,B返回告诉A去访问C,然后A去请求C,从而获取资源的过程为重定向。 常见的使用场景:登录操作。 1.1 重定向实战 1。我们先看一下重定向的方法函数,sendRedirect。 void sendRed

行为型设计模式之迭代器模式_积跬步,至千里。的博客-多极客编程

@TOC 迭代器模式 迭代器模式(Iterator Pattern)又称为游标模式(Cursor Pattern),属于行为型模式。 它提供一种顺序访问集合容器中的各个对象元素的方法,而又无须暴露集合容器的内部表示。 迭代器模式可以为不同的容器提供一致的遍历行为,而不用关心容器内容元素组成结构。 迭代器模式的本质是抽离集合对象迭代行为到迭代器中,提供一致访问接口。也就是说将集合的遍历行为抽取为单

如何快速地学习东西_宇宙之一粟的漂泊之旅的博客-多极客编程

人们常说,互联网已经使教育民主化:人类知识的总和只需在谷歌上搜索一下就可以得到!然而,获得信息只是故事的一半;你还需要能够将原始信息转化为可用的技能。对我们很多人来说,这两者之间的差距可能会导致像教程陷阱那样的事情--被卡在一个又一个的教程中,却从来没有感觉到你正在取得实质性进步。学习如何有效地学习是超级重要的,特别是作为一个软件开发人员;学习新的东西实际上是整个工作的一部分!如果你能学会快速掌握

悲观锁和乐观锁的区别以及实现方式_浅羽技术的博客-多极客编程

悲观锁 在数据库中,悲观锁的流程如下: 在对任意记录进行修改前,先尝试为该记录加上排他锁(exclusive locking)。 如果加锁失败,说明该记录正在被修改,那么当前查询可能要等待或者抛出异常。 具体响应方式由开发者根据实际需要决定。 如果成功加锁,那么就可以对记录做修改,事务完成后就会解锁了。 其间如果有其他对该记录做修改或加排他锁的操作,都会等待我们解锁或直接抛出异常。 MySQL I

我是一个垃圾_蝉沐风的博客-多极客编程

哒哒哒...... 回收者的脚步声越来越清晰,我竭力锁紧身体让自己别那么引人注目,尽管气喘吁吁,但我仍然压抑住自己的呼吸。 终归是藏不住的,但是多活个几毫秒也是好的,我们都这么想。 因为回收者是来杀我们的。 第0回 我是一个垃圾 我是一个垃圾,至少我的主人是这么喊我的。 我不知道自己做错了什么,甚至不知道自己做了什么。 我只是被他创造了出来,然后被挪来挪去,我的一生都在漂泊。 听说C帝国的朋友都是

聊聊mybatis的延迟加载_周杰伦本人的博客-多极客编程

@[TOC] 聊聊Mybatis的延迟加载 延迟加载就是在需要的数据的时候再进行加载,也就是懒加载,延迟加载是基于嵌套查询来实现的,一般在一对多,多对多的时候使用延迟加载,一对一或者多对一的时候使用立即加载 全局延迟加载 全局延迟加载: 在settings标签下配置lazyLoadingEnabled属性: <settings> <setting name="lazyLoad

javaweb实战之response重定向运用以及原理详解_上进小菜猪的博客-多极客编程

@[toc] 一.实现重定向 重定向是一个非常广泛的概念,即通过各种方法将各种网络请求重定向到其他位置,如网页重定向、域名重定向、数据包重定向等。 如上图,A为客户端,A向服务端B请求一个资源,B返回告诉A去访问C,然后A去请求C,从而获取资源的过程为重定向。 常见的使用场景:登录操作。 1.1 重定向实战 1。我们先看一下重定向的方法函数,sendRedirect。 void sendRed

#yyds干货盘点#【愚公系列】2022年08月 go教学课程 023-go容器之列表_qq61972345e36b7的博客-多极客编程

一、Go容器之列表 1.列表的定义 列表是一种数据结构,由多元素成的有限序列,即按照一定的线性顺序排列而成的数据项的集合,在这种数据结构上可以进行元素的的插入,删除,修改,和查找。 列表的两种主要表现是数组和链表,栈和队列是两种特殊类型的列表。列表(list)底层常见的数据结构有: 单链表、双链表等。 2.Go中的列表 在 Go 语言中,列表的实现都在 container/list 包中,内部实现