Python 官方文档:入门教程 => 点击学习
目录SpringBoot 项目容器启动后自动执行指定springboot 容器及启动过程问题1:为什么要启动父子两个容器?问题2:在什么时候启动父容器?问题3:父容器和子容器的区别?
我们需要写一个class去让它实现ApplicationRunner,然后重写它的run方法就行了,注意类加上@Component注解
注意:这个class需要写在和Application启动类的同级目录或者子级目录下,否则不生效。
代码:
package com.qq.weixin;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class TestRuner implements ApplicationRunner {
@Override
public void run(ApplicationArguments applicationArguments) throws Exception {
log.info("我是Spring容器启动后立即执行的方法,当前时间:"+ DateTime.now().toString("yyyy-MM-dd HH:mm:ss"));
}
}
SpringBoot会启动两个容器,即父子容器
思考几个问题:
在Spring整体框架的核心概念中,容器是核心思想,而在一个项目中,容器不一定只有一个,Spring中可以包括多个容器,使用上下层关系来管理容器可以解决公共属性抽取的问题,即将公共的属性放到父容器中,对其各个子容器均可见,实现了复用功能,注意子容器对父容器是不可见的。
准备环境变量,即执行prepareEnvironment方法时,发布ApplicationEnvironmentPreparedEvent事件,BootstrapApplicationListener监听器收到该事件,会初始化父容器
1.子容器中会创建植入的Tomcat容器类,用来管理tomcat服务,父容器没有
2.父容器管理的bean集合是spring框架内置的一些bean,子容器管理的bean集合是我们业务定义的bean以及spring框架内置的bean
执行prepareEnvironment方法时,BootstrapApplicationListener监听器不再重复执行?
父容器初始化完成后,会在webEnvironment属性中加入bootstrap属性标识,这样就可以根据该标识来判断是否需要执行了
容器通过beanFactory来管理对象,父子容器都会各持有一个DefaultListableBeanFactory,即父子容器都会管理各自的bean。
子容器启动流程:
1.执行初始化:初始化webEnvironment以及listeners
2.发布容器启动事件
3.在执行prepareEnvironment步骤时,发布ApplicationEnvironmentPreparedEvent事件,BootstrapApplicationListener监听器收到该事件,会再次调用SpringApplication
4.创建context,通过判断webEnvironment标识,这时为true,创建AnnotationConfigEmbeddedWebApplicationContext实例
5.执行refreshContext,比较核心的方法,详细说一下:
6.执行afterRefresh,调用实现了ApplicationRunner/CommandLineRunner接口的bean run方法
7.发布ApplicationReadyEvent事件
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
--结束END--
本文标题: springboot 项目容器启动后如何自动执行指定方法
本文链接: https://www.lsjlt.com/news/156801.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0