spring bean 初始化的流程如下:
初始化顺序演示程序
pom文件
<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>
<artifactId>springBean</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
<version>2.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.2.2.RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
启动类
package springBean;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MainBean {
public static void main(String[] args) throws Exception {
SpringApplication.run(MainBean.class, args);
}
}
Bean配置文件
package springBean.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springBean.bean.BeanInitOrder;
@Configuration
public class BeanConfig {
@Bean(name = {"beanInitOrder"},initMethod = "initMethod" ,destroyMethod = "destroyMethod")
public BeanInitOrder getBeanInitOrder(){
return new BeanInitOrder();
}
}
Bean初始化前置执行配置文件(对所有bean通用)
package springBean.config;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
@Component
public class MyBeanPostProcessor implements BeanPostProcessor{
/*
* 本方法一定要返回bean对象
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if("beanInitOrder".equals(beanName)) {
System.out.println(beanName+"执行对象初始化前-前置处理");
}
return bean;
}
/*
* 本方法一定要返回bean对象
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if("beanInitOrder".equals(beanName)) {
System.out.println(beanName+"执行对象初始化后-后置处理");
}
return bean;
}
}
Bean文件
package springBean.bean;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.beans.factory.annotation.Autowired;
public class BeanInitOrder {
@Autowired
public BeanInitOrder2 order;
public BeanInitOrder() {
System.out.println("bean对象实例化-构造方法");
}
@PostConstruct
public void init() {
System.out.println("Bean-PostConstruct");
}
@PreDestroy
public void preDestroy() {
System.out.println("Bean-preDestroy");
}
public void initMethod() {
System.out.println("initMethod");
}
public void destroyMethod() {
System.out.println("destroyMethod");
}
}
执行打印结果