欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > Spring (六)容器-生命周期

Spring (六)容器-生命周期

2025/3/15 8:02:08 来源:https://blog.csdn.net/2302_79847831/article/details/146085388  浏览:    关键词:Spring (六)容器-生命周期

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集

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词