一文搞懂Spring中Bean的生命周期

 更新时间:2022年06月08日 08:42:44   作者:夏志121  
这篇文章主要为大家介绍了Spring中Bean生命周期的使用及控制,文中的示例代码讲解详细,对我们学习或工作有一定的参考价值,感兴趣的可以学习一下

生命周期:从创建到消亡的完整过程

bean声明周期:bean从创建到销毁的整体过程

bean声明周期控制:在bean创建后到销毁前做一些事情

一、使用配置生命周期的方法

在BookDaoImpl中实现类中创建相应的方法:

//表示bean初始化对应的操作
    public void init(){
        System.out.println("init...");
    }
    //表示bean销毁前对应的操作
    public void destory(){
        System.out.println("destory...");
    }

applicationContext.xml配置初始化声明周期回调函数及销毁声明周期回调函数

 <!--init-method:设置bean初始化生命周期回调函数-->
    <!--destroy-method:设置bean销毁生命周期回调函数,仅适用于单例对象-->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>

执行结果:

虚拟机退出,没有给bean销毁的机会。

可利用ClassPathXmlApplictionContext里的close方法主动关闭容器,就会执行销毁方法。

import com.itheima.dao.BookDao;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class AppForLifeCycle {
    public static void main( String[] args ) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
 
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();
 
        //关闭容器
        ctx.close();
    }
}

执行结果:

不过这种方式比较暴力,容器还提供另外的方法

在AppForLifeCycle中用关闭钩子函数

//注册关闭钩子函数,在虚拟机退出之前回调此函数,关闭容器
        ctx.registerShutdownHook();

执行结果:

关闭钩子在任何时间都可以执行,close关闭比较暴力。

二、生命周期控制——接口控制(了解)

applicationContext.xml配置:

    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
        <property name="bookDao" ref="bookDao"/>
    </bean>

BookServiceImpl:

可以利用接口InitializingBean和DisposableBean来设置初始化和销毁后的方法设置

import com.itheima.dao.BookDao;
import com.itheima.service.BookService;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
 
public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
    private BookDao bookDao;
 
    public void setBookDao(BookDao bookDao) {
        System.out.println("set .....");
        this.bookDao = bookDao;
    }
 
    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
 
    public void destroy() throws Exception {
        System.out.println("service destroy");
    }
 
    public void afterPropertiesSet() throws Exception {
        System.out.println("service init");
    }
}

执行结果:

可以看出set在执行在init的执行之后,当你的属性设置完以后,才去执行afterPropertiesSet,所有才叫afterPropertiesSet,在属性设置之后。

小结

生命周期总结

初始化容器

  • 1、创建对象
  • 2、执行构造方法
  • 3、执行属性注入(set操作)
  • 4、执行bean初始化方法

使用bean

执行业务操作

关闭/销毁容器

执行bean操作

1、bean生命周期控制

配置

init-method
destroy-method

接口(了解)

InitializingBean
DisposableBean

2、关闭容器

ConfigurableApplicationContext

close()
registerShutdownHook()

到此这篇关于一文搞懂Spring中Bean的生命周期的文章就介绍到这了,更多相关Spring Bean生命周期内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java HttpURLConnection使用方法与实例演示分析

    Java HttpURLConnection使用方法与实例演示分析

    这篇文章主要介绍了Java HttpURLConnection使用方法与实例演示,HttpURLConnection一个抽象类是标准的JAVA接口,该类位于java.net包中,它提供了基本的URL请求,响应等功能,下面我们来深入看看
    2023-10-10
  • Java的Lock接口与读写锁详解

    Java的Lock接口与读写锁详解

    这篇文章主要介绍了Java的Lock接口与读写锁详解,锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源,但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁,需要的朋友可以参考下
    2023-12-12
  • JAVA基础之注解与反射的使用方法和场景

    JAVA基础之注解与反射的使用方法和场景

    这篇文章主要给大家介绍了关于JAVA基础之注解与反射的使用方法和场景的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • java8中lamba表达式的使用

    java8中lamba表达式的使用

    这篇文章主要介绍了java8中lamba表达式的使用,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • JVM 方法调用之静态分派(详解)

    JVM 方法调用之静态分派(详解)

    下面小编就为大家带来一篇JVM 方法调用之静态分派(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 使用SpringBoot自定义starter详解

    使用SpringBoot自定义starter详解

    这篇文章主要介绍了使用Spring Boot自定义starter详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好地帮助哟,需要的朋友可以参考下
    2021-05-05
  • 微服务通过Feign调用进行密码安全认证操作

    微服务通过Feign调用进行密码安全认证操作

    这篇文章主要介绍了微服务通过Feign调用进行密码安全认证操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java更新调度器(update scheduler)的使用详解

    Java更新调度器(update scheduler)的使用详解

    Java更新调度器是Java中的一个特性,可以自动化Java应用程序的更新过程,它提供了一种方便的方式来安排Java应用程序的更新,确保其与最新的功能、错误修复和安全补丁保持同步,本文将深入介绍如何使用Java更新调度器,并解释它对Java开发人员和用户的好处
    2023-11-11
  • Java实现常见的排序算法的示例代码

    Java实现常见的排序算法的示例代码

    这篇文章主要为大家详细介绍了Java实现常见的排序算法(选择排序、插入排序、希尔排序等)的相关资料,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-10-10
  • Java多种获取项目路径下的文件方式

    Java多种获取项目路径下的文件方式

    文章介绍了在Java项目中获取resources文件夹下文件的InputStream的多种方法,包括使用类加载器、上下文类加载器、系统属性和Paths类
    2024-12-12

最新评论