Spring容器的生命周期管理是其核心功能之一,涵盖了从容器启动到关闭的整个过程。
流程图解析与Spring Bean生命周期对应关系
1. 创建组件(Bean实例化)
-
触发时机:当Spring容器启动时,根据配置或组件扫描创建Bean实例。
-
底层实现:调用类的构造器(默认是无参构造器,若需要参数需结合其他配置)。
-
示例:、
public class DatabaseService {public DatabaseService() {System.out.println("1. 构造器调用:DatabaseService实例被创建");}
}
2. 依赖注入(@Autowired属性注入)
-
触发时机:Bean实例化后,立即进行依赖注入。
-
注解作用:
@Autowired
用于自动装配其他Bean或值到当前Bean的属性中。 -
示例:
public class UserService {@Autowiredprivate DatabaseService databaseService;public UserService() {System.out.println("2. UserService构造器调用");}
}
输出顺序
1. 构造器调用:DatabaseService实例被创建
2. UserService构造器调用
→ DatabaseService通过@Autowired注入到UserService
3 初始化方法(initMethod)
-
触发时机:依赖注入完成后,容器调用初始化方法。
-
支持的初始化方式:
-
@PostConstruct
注解:优先级最高。 -
InitializingBean
接口:实现afterPropertiesSet()
方法。 -
@Bean(initMethod = "xxx")
:显式指定方法。
-
-
执行顺序:
@PostConstruct → InitializingBean → initMethod
public class CacheManager {@PostConstructpublic void postConstruct() {System.out.println("3.1 @PostConstruct方法执行");}public void initCache() {System.out.println("3.2 initMethod方法执行");}
}@Configuration
public class AppConfig {@Bean(initMethod = "initCache")public CacheManager cacheManager() {return new CacheManager();}
}
3.1 @PostConstruct方法执行
3.2 initMethod方法执行
4 运行中(Bean就绪)
-
状态:此时Bean已完全初始化,可被其他组件调用。
-
示例:
@Service
public class OrderService {public void placeOrder() {System.out.println("订单已创建");}
}
5 销毁方法(destroyMethod)
-
触发时机:容器关闭时(如调用
context.close()
或应用正常退出)。 -
支持的销毁方式:
-
@PreDestroy
注解:优先级最高。 -
DisposableBean
接口:实现destroy()
方法。 -
@Bean(destroyMethod = "xxx")
:显式指定方法。
-
-
执行顺序:
@PreDestroy → DisposableBean → destroyMethod
代码实现:
public class NetworkConnection {@PreDestroypublic void preDestroy() {System.out.println("5.1 @PreDestroy方法执行:释放网络资源");}public void close() {System.out.println("5.2 destroyMethod方法执行:关闭连接");}
}@Configuration
public class AppConfig {@Bean(destroyMethod = "close")public NetworkConnection networkConnection() {return new NetworkConnection();}
}
输出:
5.1 @PreDestroy方法执行:释放网络资源
5.2 destroyMethod方法执行:关闭连接
完整流程:
public class PaymentGateway {public PaymentGateway() {System.out.println("1. 构造器调用:PaymentGateway实例化");}@Autowiredpublic void setLogger(Logger logger) {System.out.println("2. @Autowired注入:Logger依赖已设置");}@PostConstructpublic void init() {System.out.println("3.1 @PostConstruct:初始化支付通道");}public void customInit() {System.out.println("3.2 initMethod:加载支付配置");}@PreDestroypublic void preDestroy() {System.out.println("5.1 @PreDestroy:断开支付服务连接");}public void cleanup() {System.out.println("5.2 destroyMethod:释放资源");}
}@Configuration
public class AppConfig {@Bean(initMethod = "customInit", destroyMethod = "cleanup")public PaymentGateway paymentGateway() {return new PaymentGateway();}
}
容器启动时输出:
1. 构造器调用:PaymentGateway实例化
2. @Autowired注入:Logger依赖已设置
3.1 @PostConstruct:初始化支付通道
3.2 initMethod:加载支付配置
容器关闭时输出:
5.1 @PreDestroy:断开支付服务连接
5.2 destroyMethod:释放资源
个人代码实现
一 容器启动
二 实例化阶段
1 调用构造器创建Bean实例
三 依赖注入
2 @Autowired属性注入
四 初始化阶段
3 @PostConstruct方法执行
4 @InitializeBean.afterPropertiesSet()
5 @Bean(initMethod)指定方法
五 运行阶段:Bean处于可用状态
六 销毁状态
@PreDestroy()方法执行
@Bean(destroyMethod)指定方法
代码实现:
package org.example.spring01.bean;import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import lombok.Data;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;/*** User类代表一个用户对象,包括用户的名称、密码和拥有的汽车* 它实现了InitializingBean和DisposableBean接口,用于管理对象的初始化和销毁过程*/
@Data
public class User implements InitializingBean, DisposableBean {private String name;private String password;private Car car;/*** 通过@Autowired注解自动注入Car对象** @param car 要注入的Car对象*/@Autowiredpublic void setCar(Car car) {this.car = car;System.out.println("set注入");}public User() {System.out.println("user构造器");}/*** 初始化User对象的方法,使用@bean注解*/public void initUser() {System.out.println("@bean初始化");}/*** 销毁User对象的方法,使用@bean注解*/public void destroyUser() {System.out.println("@bean销毁");}/*** 实现InitializingBean接口的afterPropertiesSet方法* 在所有属性设置完成后调用此方法** @throws Exception 可能抛出的异常*/@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("实现InitializingBean接口的afterPropertiesSet");}/*** 实现DisposableBean接口的destroy方法* 在对象销毁前调用此方法** @throws Exception 可能抛出的异常*/@Overridepublic void destroy() throws Exception {System.out.println("实现DisposableBean接口的destroy");}/*** 使用@PostConstruct注解的方法* 在构造器调用之后执行,用于执行初始化代码*/@PostConstructpublic void postConstruct() {System.out.println("注解@PostConstruct的方法");}/*** 使用@PreDestroy注解的方法* 在对象销毁之前执行,用于释放资源*/@PreDestroypublic void preDestroy() {System.out.println("@PreDestroy的方法");}
}
package org.example.spring01.config;import org.example.spring01.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** User配置类,用于定义用户相关的Bean*/
@Configuration
public class UserConfig {/*** 定义一个User类型的Bean** @return User实例** 使用initMethod和destroyMethod指定初始化和销毁方法* initMethod:在Bean初始化时调用* destroyMethod:在Bean销毁时调用*/@Bean(initMethod = "initUser", destroyMethod = "destroyUser")public User user() {return new User();}}
public static void main(String[] args) {ConfigurableApplicationContext ioc = SpringApplication.run(Spring01Application.class, args);System.out.println("ioc容器创建完成");User bean = ioc.getBean(User.class);System.out.println("bean = " + bean);}
拓展:BeanPostProcessor
37集 38集