spring boot 生命周期初探
1、MytestApplication
package com.gomepay; import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class MytestApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(MytestApplication.class);
app.setBannerMode(Banner.Mode.OFF);
app.addListeners(new ApplicationStartup());
app.run(args);
}
}
2、StartupOrder
package com.gomepay; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.web.context.WebServerApplicationContext;
import org.springframework.boot.web.context.WebServerInitializedEvent;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.web.context.ServletContextAware; import javax.annotation.PostConstruct;
import javax.servlet.ServletContext; @Configuration
public class StartupOrder {
@Bean
static BeanDefinitionRegistryPostProcessor beanPostProcessor(final ConfigurableEnvironment environment) {
return new BeanDefinitionRegistryPostProcessor() {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
System.out.println("======1.BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry()");
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("======2.BeanDefinitionRegistryPostProcessor.postProcessBeanFactory()");
}
};
}
@PostConstruct
private void init() {
System.out.println("======3.@PostConstruct");
}
@Bean
static ServletContextAware servletContextAware(final ConfigurableEnvironment environment) {
return new ServletContextAware() {
@Override
public void setServletContext(ServletContext servletContext) {
System.out.println("======4.ServletContextAware.setServletContext()");
}
};
}
@Bean
static BeanNameAware beanNameAware(final ConfigurableEnvironment environment) {
return new BeanNameAware() {
@Override
public void setBeanName(String name) {
environment.getProperty("app.info");
System.out.println("======5.BeanNameAware.setBeanName()");
}
};
}
@Bean
static ApplicationContextAware aware(final ConfigurableEnvironment environment) {
return new ApplicationContextAware() {
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("======6.ApplicationContextAware.setApplicationContext()");
}
};
}
@Bean
static InitializingBean initBean(final ConfigurableEnvironment environment) {
return new InitializingBean() {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("======7.InitializingBean.afterPropertiesSet()");
}
};
} /**
* 在tomcat启动成功时
* @param event
*/
@EventListener(WebServerInitializedEvent.class)
public void onWebServerReady(WebServerInitializedEvent event) {
System.out.println("======9.@EventListener(WebServerInitializedEvent.class)");
}
/**
* 在spring boot应用启动后回调
* @param context
* @return
*/
@Bean
public ApplicationRunner runner(WebServerApplicationContext context) {
return args -> {
System.out.println("======10.ApplicationRunner");
};
}
} class ApplicationStartup implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
ApplicationContext ac = event.getApplicationContext();
//User user = ac.getBean(User.class);
System.out.println("======8.ApplicationListener.onApplicationEvent()");
}
}
输出日志:
13:57:38.764 DEBUG | Loading source class com.gomepay.MytestApplication
13:57:38.813 DEBUG | Activated activeProfiles prod
13:57:38.813 DEBUG | Loaded config file 'file:/D:/tutorial/springboot/mycode/springboot-24-01-dynamic-beans/target/classes/application.yml' (classpath:/application.yml)
13:57:38.813 DEBUG | Loaded config file 'file:/D:/tutorial/springboot/mycode/springboot-24-01-dynamic-beans/target/classes/application-prod.yml' (classpath:/application-prod.yml) for profile prod
13:57:38.814 DEBUG | Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@662b4c69
13:57:38.834 DEBUG | Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
13:57:38.844 DEBUG | Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory'
13:57:38.899 DEBUG | Identified candidate component class: file [D:\tutorial\springboot\mycode\springboot-24-01-dynamic-beans\target\classes\com\gomepay\StartupOrder.class]
13:57:39.040 DEBUG | Found key 'spring.application.admin.enabled' in PropertySource 'configurationProperties' with value of type String
13:57:39.208 DEBUG | Found key 'spring.application.admin.enabled' in PropertySource 'configurationProperties' with value of type String
13:57:39.257 DEBUG | Creating shared instance of singleton bean 'beanPostProcessor'
13:57:39.263 DEBUG | Autowiring by type from bean name 'beanPostProcessor' via factory method to bean named 'environment'
======1.BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry()
======2.BeanDefinitionRegistryPostProcessor.postProcessBeanFactory()
13:57:39.334 DEBUG | Creating shared instance of singleton bean 'propertySourcesPlaceholderConfigurer'
13:57:39.337 DEBUG | Creating shared instance of singleton bean 'org.springframework.boot.context.properties.ConfigurationPropertiesBeanDefinitionValidator'
13:57:39.464 DEBUG | Autowiring by type from bean name 'servletWebServerFactoryCustomizer' via factory method to bean named 'server-org.springframework.boot.autoconfigure.web.ServerProperties'
13:57:39.637 INFO | Tomcat initialized with port(s): 8080 (http)
13:57:39.647 INFO | Initializing ProtocolHandler ["http-nio-8080"]
13:57:39.648 INFO | Starting service [Tomcat]
13:57:39.806 DEBUG | Mapping servlets: dispatcherServlet urls=[/]
13:57:39.822 DEBUG | Filter 'requestContextFilter' configured for use
13:57:39.822 DEBUG | Filter 'characterEncodingFilter' configured for use
13:57:39.822 DEBUG | Filter 'formContentFilter' configured for use
13:57:39.831 DEBUG | Creating shared instance of singleton bean 'mytestApplication'
13:57:39.832 DEBUG | Creating shared instance of singleton bean 'startupOrder'
======3.@PostConstruct
13:57:39.833 DEBUG | Creating shared instance of singleton bean 'servletContextAware'
13:57:39.833 DEBUG | Autowiring by type from bean name 'servletContextAware' via factory method to bean named 'environment'
======4.ServletContextAware.setServletContext()
13:57:39.834 DEBUG | Creating shared instance of singleton bean 'beanNameAware'
13:57:39.834 DEBUG | Autowiring by type from bean name 'beanNameAware' via factory method to bean named 'environment'
13:57:39.835 DEBUG | Found key 'app.info' in PropertySource 'configurationProperties' with value of type String
======5.BeanNameAware.setBeanName()
13:57:39.836 DEBUG | Creating shared instance of singleton bean 'aware'
13:57:39.836 DEBUG | Autowiring by type from bean name 'aware' via factory method to bean named 'environment'
======6.ApplicationContextAware.setApplicationContext()
13:57:39.837 DEBUG | Creating shared instance of singleton bean 'initBean'
13:57:39.837 DEBUG | Autowiring by type from bean name 'initBean' via factory method to bean named 'environment'
======7.InitializingBean.afterPropertiesSet()
13:57:39.838 DEBUG | Creating shared instance of singleton bean 'runner'
。。。
======8.ApplicationListener.onApplicationEvent()
13:57:40.147 DEBUG | Found key 'spring.liveBeansView.mbeanDomain' in PropertySource 'systemProperties' with value of type String
13:57:40.147 INFO | Starting ProtocolHandler ["http-nio-8080"]
13:57:40.170 INFO | Tomcat started on port(s): 8080 (http) with context path ''
======9.@EventListener(WebServerInitializedEvent.class)
13:57:40.173 INFO | Started MytestApplication in 1.852 seconds (JVM running for 4.396)
======10.ApplicationRunner
13:57:40.458 DEBUG | Found key 'local.server.port' in PropertySource 'server.ports' with value of type Integer
spring boot 生命周期初探的更多相关文章
- Spring的生命周期
转:https://blog.csdn.net/liuxilil/article/details/4676088 Spring的生命周期. 容器启动,实例化所有实现了BeanFactoyPostPro ...
- spring bean 生命周期和 ? 作用域? spirng bean 相互依赖? jvm oom ? jvm 监控工具? ThreadLocal 原理
1. spring bean 生命周期 1. 实例化一个bean ,即new 2. 初始化bean 的属性 3. 如果实现接口 BeanNameAware ,调用 setBeanName 4. Bea ...
- Spring点滴四:Spring Bean生命周期
Spring Bean 生命周期示意图: 了解Spring的生命周期非常重要,我们可以利用Spring机制来定制Bean的实例化过程. -------------------------------- ...
- spring之生命周期
1.容器中对的生命周期 spring可以管理 singleton作用域的bean的生命周期,spring可以精确地知道该bean何时被创建,何时被初始化完成,容器合适准备销毁该bean实例. spri ...
- Spring Bean 生命周期之destroy——终极信仰
上一篇文章 Spring Bean 生命周期之我从哪里来 说明了我是谁? 和 我从哪里来? 的两大哲学问题,今天我们要讨论一下终极哲学我要到哪里去? 初始化 Spring Bean 有三种方式: @P ...
- 常见问题:Web/Servlet生命周期与Spring Bean生命周期
Servlet生命周期 init()初始化阶段 Servlet容器加载Servlet(web.xml中有load-on-startup=1;Servlet容器启动后用户首次向Servlet发请求;Se ...
- spring的后置处理器——BeanPostProcessor以及spring的生命周期
后置处理器的调用时机 BeanPostProcessor是spring提供的接口,它有两个方法——postProcessBeforeInitialization.postProcessAfterIni ...
- 大厂高频面试题Spring Bean生命周期最详解
Spring作为当前Java最流行.最强大的轻量级框架.Spring Bean的生命周期也是面试高频题,了解Spring Bean周期也能更好地帮助我们解决日常开发中的问题.程序员应该都知道Sprin ...
- Spring Bean生命周期,好像人的一生。。
大家好,我是老三,上节我们手撸了一个简单的IOC容器五分钟,手撸一个Spring容器!,这节我们来看一看Spring中Bean的生命周期,我发现,和人的一生真的很像. 简单说说IoC和Bean IoC ...
随机推荐
- I2S 总线学习:2-I2S驱动WM8978
背景 为了了解I2S总线所对应的硬件设计,下文转载了<STM32:I2S驱动WM8978>. 以加深对I2S总线的了解. 正文 最近项目中使用STM32F4驱动音频IC:WM8978. 由 ...
- Mozilla Firefox 68 正式发布下载:对刚Chrome
Mozilla Firefox 68开源和跨平台Web浏览器现在正式发布,可以下载适用于GNU/Linux,Mac和Windows平台的Firefox 68了. Firefox 68网络浏览器现在可以 ...
- 一个小证明(题解 P5425 Part1)
所以这道题为什么可以这样做 嗯,我也不知道,不过我是来填坑的. \(Q\):为什么要把牛分成\(1\),\(1\)......\(N-K+1\)这样的\(K\)组呢? \(A\):我们设第\(i\)组 ...
- CRC校验算法详解
CRC(Cyclic Redundancy Check)循环冗余校验是常用的数据校验方法,讲CRC算法的文章很多,之所以还要写这篇,是想换一个方法介绍CRC算法,希望能让大家更容易理解CRC算法. 先 ...
- java#StringBuffer&StringBuilder
StringBuffer A thread-safe, mutable sequence of characters. A string buffer is like a String, but ca ...
- 02.swoole学习笔记--UDP服务器
<?php //创建服务器 $serv=,SWOOLE_PROCESS,SWOOLE_SOCK_UDP); //bool $swoole_server->on(string $event, ...
- 如何在PHP中进行会话处理?
在PHP中会话处理是一个很重要的概念,它允许用户信息在网站或应用程序的所有页面上保持不变.下面本篇文章就来带大家学习一下PHP中会话处理的基础知识,希望对大家有所帮助. PHP中什么是会话(sessi ...
- 13.在项目中部署redis企业级数据备份方案以及各种踩坑的数据恢复容灾演练
到这里为止,其实还是停留在简单学习知识的程度,学会了redis的持久化的原理和操作,但是在企业中,持久化到底是怎么去用得呢? 企业级的数据备份和各种灾难下的数据恢复,是怎么做得呢? 1.企业级的持久化 ...
- JS: 随机点名程序与万年历
随机点名程序 document.write(Math.random()); var stu = ["张三", "王五", "张二", &qu ...
- C# Winform使用线程,委托定时更新界面UI控件,解决界面卡顿问题(转载)
一.定时执行主界面控件值 1.利用定时器 Thread t = null; private void InitTSJK() { t = new Thread(new ThreadStart(GetDa ...