Bean生命周期(1)---Spring源码从入门到精通(七)

简介: Bean生命周期(1)---Spring源码从入门到精通(七)

上篇文章主要介绍了FactoryBean接口,实现后,可以注入bean,在ioc容器中默认放的是getObject返回的bean:


Spring源码从入门到精通---FactoryBean接口(六)


这篇文章主要介绍Bean的生命周期,bean的生命周期指:bean的创建--->初始化--->销毁

1、问?bean初始化的时候?

单实例是在容器创建时bean初始化,调用construct。

多实例实在获取实例的时候初始化。


2、问?bean销毁的时候?

单实例在容器关闭的时候销毁。

多实例在容器关闭时候并不会销毁,多实例的对象不归ioc容器管理。


一、单实例生命周期创建和销毁


自定义car,里面写个无参构造方法,init,destory,自定义配置类,用@Bean注解的init-Method来指定初始化方法和destory-Method来指定销毁方法。

public class Car {
    public Car(){
        System.out.println("car ... construct");
    }
    private void init(){
        System.out.println("car ... init");
    }
    private void destory(){
        System.out.println("car ... destory");
    }
}
/**
 * bean生命周期:
 *    bean创建 ---> 初始化 ---> 销毁
 * 容器管理bean的生命周期
 * 我们可以自定义初始化和销毁,bean进行到当前生命周期的时候,调用自定义的创建和销毁
 *
 *  单实例,容器创建的时候construct创建对象和init初始化。
 *        多实例,获取对象的时候construct创建对象和init初始化。不会交给ioc容器管理,所以容器关        
 *         闭不会销毁。
 *  1)通过@Bean注释 init-method和destory-method的两个方法,指定对象的创建和销毁。
 *    什么时候调用:初始化,对象创建完成,并且赋值好,开始调用。
 *                销毁,容器关闭的时候调用。(多实例的时候不会调用销毁,因为容器不会管理这个bean)
 *
 * @author keying
 */
@Configuration
public class ConfigLifeCycle {
    //@Scope("prototype")
    @Bean(initMethod = "init", destroyMethod = "destory")
    public Car car(){
        return new Car();
    }
}
public class TestLiftCycle {
    @Test
    public void test() {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(
            ConfigLifeCycle.class);
        System.out.println("容器创建完毕");
        //多实例情况下,需要获取组件,才会初始化,并且不会销毁
        //Object carObject = annotationConfigApplicationContext.getBean("car");
        //getDefinitionNames(annotationConfigApplicationContext);
        annotationConfigApplicationContext.close();
    }
}

用junit打印之后,可以看到,单实例的情况下,在容器创建完毕之前,会调用构造函数construct创建对象和init初始化,在注解AnnotationConfigApplicationContext获取的容器关闭之后,会调用destory销毁。

image.png


二、多实例生命周期创建和销毁


多实例就可以用到之前的注解,吧@Scope指定多实例,并且需要 获取组件,因为多实例在getBean的时候才会创建对象调用construct和调用初始化init方法。

 @Scope("prototype")
    @Bean(initMethod = "init", destroyMethod = "destory")
    public Car car(){
        return new Car();
    }
@Test
    public void test() {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(
            ConfigLifeCycle.class);
        System.out.println("容器创建完毕");
        //多实例情况下,需要获取组件,才会初始化,并且不会销毁
        Object carObject = annotationConfigApplicationContext.getBean("car");
        //getDefinitionNames(annotationConfigApplicationContext);
        annotationConfigApplicationContext.close();
    }

结果如下,可以看到,destory并不会调用,并且是在ioc容器加载完毕之后才初始化bean。

image.png

相关文章
|
17天前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
8天前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
1天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
9 2
|
7天前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
28 9
|
27天前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
1月前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
104 5
|
1月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
23 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
1月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
22 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
1月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
161 2