项目简介
- 基于
springboot 2.1.1
- 使用
maven
管理项目 - 非
web
项目
源代码
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>tut</groupId>
<artifactId>zero</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
配置文件 application.yml
threshold: 1000
主程序类
package tut.zero;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application implements CommandLineRunner {
@Autowired
MyBean bean;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... args) {
bean.serve();
}
}
用于观察bean生命周期方法调用顺序而自定义的bean
package tut.zero;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Component
public class MyBean implements InitializingBean, DisposableBean, BeanNameAware, BeanClassLoaderAware,
BeanFactoryAware, ApplicationContextAware {
public MyBean() {
System.out.println("1.bean构造阶段 - 1.新建对象 - 构造函数被调用");
}
Integer threshold = null;
@Value("${threshold}")
public void setThreshold(int threshold) {
System.out.println("1.bean构造阶段 - 2.填充属性 - bean属性注入方法被调用 - @Value setThreshold()");
this.threshold = threshold;
}
@Autowired
public void setEnvironment(Environment environment) {
System.out.println("1.bean构造阶段 - 2.填充属性 - bean依赖注入方法被调用 - @Autowired setEnvironment()");
this.environment = environment;
}
Environment environment;
@PostConstruct
public void postConstruct() {
final boolean dependentBeanResolved = this.environment != null;
final boolean dependentPropertyResolved = this.threshold != null;
System.out.printf(
"1.bean构造阶段 - 3.初始化 - JSR-250 @PostConstruct - " +
"@Autowired注解bean已设置 : %s ,@Value注入属性已设置 : %s \n",
dependentBeanResolved,
dependentPropertyResolved
);
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("1.bean构造阶段 - 3.初始化 " +
"- InitializingBean#afterPropertiesSet");
}
public void serve() {
System.out.println("2.bean服务阶段 - 业务方法被调用");
}
@PreDestroy
public void preDestroy() {
System.out.println("3.bean销毁阶段 - 1.JSR-250 @PreDestroy");
}
@Override
public void destroy() throws Exception {
System.out.println("3.bean销毁阶段 - 2.DisposableBean#destroy");
}
public void setBeanName(String name) {
System.out.printf("1.bean构造阶段 - 3.初始化 - " +
"Aware 接口方法调用 - BeanNameAware#setBeanName\n");
}
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
System.out.printf("1.bean构造阶段 - 3.初始化 - " +
"Aware 接口方法调用 - BeanClassLoaderAware#setBeanClassLoader\n");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.printf("1.bean构造阶段 - 3.初始化 - " +
"Aware 接口方法调用 - BeanFactoryAware#setBeanFactory\n");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.printf("1.bean构造阶段 - 3.初始化 - " +
"Aware 接口方法调用 - ApplicationContextAware#setApplicationContext\n");
}
}
用于观察bean生命周期方法调用顺序而自定义的BeanPostProcessor
package tut.zero;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof MyBean)
System.out.printf("1.bean构造阶段 - 3.初始化 - " +
"MyBeanPostProcessor#postProcessBeforeInitialization('%s')\n", beanName);
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof MyBean)
System.out.printf("1.bean构造阶段 - 3.初始化 - " +
"MyBeanPostProcessor#postProcessAfterInitialization('%s')\n", beanName);
return bean;
}
}
bean生命周期方法调用顺序
1.bean构造阶段 - 1.新建对象 - 构造函数被调用
1.bean构造阶段 - 2.填充属性 - bean属性注入方法被调用 - @Value setThreshold()
1.bean构造阶段 - 2.填充属性 - bean依赖注入方法被调用 - @Autowired setEnvironment()
1.bean构造阶段 - 3.初始化 - Aware 接口方法调用 - BeanNameAware#setBeanName
1.bean构造阶段 - 3.初始化 - Aware 接口方法调用 - BeanClassLoaderAware#setBeanClassLoader
1.bean构造阶段 - 3.初始化 - Aware 接口方法调用 - BeanFactoryAware#setBeanFactory
1.bean构造阶段 - 3.初始化 - Aware 接口方法调用 - ApplicationContextAware#setApplicationContext
1.bean构造阶段 - 3.初始化 - MyBeanPostProcessor#postProcessBeforeInitialization('myBean')
1.bean构造阶段 - 3.初始化 - JSR-250 @PostConstruct - @Autowired注解bean已设置 : true ,@Value注入属性已设置 : true
1.bean构造阶段 - 3.初始化 - InitializingBean#afterPropertiesSet
1.bean构造阶段 - 3.初始化 - MyBeanPostProcessor#postProcessAfterInitialization('myBean')
2.bean服务阶段 - 业务方法被调用
3.bean销毁阶段 - 1.JSR-250 @PreDestroy
3.bean销毁阶段 - 2.DisposableBean#destroy
相关文章
Spring bean的生命周期