七、spring生命周期之初始化和销毁方法
一、通过@Bean指定初始化和销毁方法
在以往的xml中,我们是这样配置的
<bean id="exampleInitBean" class="examples.ExampleBean" init-method="init" destroy-method="cleanup"/>
那如果采用注解 的方式该如何配置呢?
首先我们创建一个Car,
public class Car {
public Car(){
System.out.println("car constructor..."); // 构造方法
}
public void init(){
System.out.println("car ... init..."); // 初始化方法
}
public void detory(){
System.out.println("car ... detory..."); // 销毁方法
}
}
我们需要通过配置类将这个Car注册进容器中,当然这很简单。
@Configuration
public class MainConfigOfLifeCycle {
//@Scope("prototype")
@Scope("singleton") // 默认即单例
@Bean(initMethod="init",destroyMethod="detory")
public Car car(){
return new Car();
}
}
这样就搞定了,在ioc容器启动的时候,将会把Car这个类加载进容器创建其单例对象。
那我们主要是观察其初始化和销毁方法
测试方法:
@Test
public void test01(){
//1、创建ioc容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("容器创建完成...");
//applicationContext.getBean("car");
//关闭容器
applicationContext.close();
}
打印其输出,
car constructor...
car ... init...
容器创建完成...
cat...destroy...
小结: bean的生命周期:bean创建---初始化----销毁的过程,
容器管理bean的生命周期;
我们可以自定义初始化和销毁方法;
容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法
观察上面的结果,也可以发现,在单例模式下,容器启动时则创建单例的car对象,并调用其初始化方法init,当容器要关闭时,执行其销毁方法destroy。
在多例模式下,这里没测,多例模式下,当我们主动获取对象的时候,容器才会创建bean,类似于一种懒加载机制,另外,在多例模式下,我们观察不到销毁方法的执行,因为多例模式下,spring的ioc不再管理我们自定义的销毁方法。
二、实现InitializingBean,DisposableBean定义初始化和销毁方法
InitializingBean接口只有一个抽象方法:
void afterPropertiesSet() throws Exception;
DisposableBean接口也只有一个抽象方法
void destroy() throws Exception;
我们写一个普通类继承这两个接口 ,
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
@Component
public class Cat implements InitializingBean,DisposableBean {
public Cat(){
System.out.println("cat constructor...");
}
@Override
public void destroy() throws Exception {
System.out.println("cat...destroy...");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("cat...afterPropertiesSet...");
}
}
编写一个测试方法,启动ioc容器,测试它的生命周期
@Test
public void test01(){
//1、创建ioc容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("容器创建完成...");
//applicationContext.getBean("car");
//关闭容器
applicationContext.close();
}
控制台打印:
cat constructor...
cat...afterPropertiesSet...
容器创建完成...
cat...destroy...
从方法名就能看出,在cat这个对象的的属性都被注入之后,就会调用afterPropertiesSet这个方法
再容器销毁前,会调用Cat类的destroy方法。
三、通过@PostConstruct和@PreDestroy
这两个是JSR250规范中的,标注在方法上,也是在对象创建完成属性赋值之后,同样也是在容器销毁之前@PreDestroy标注的方法会被调用
我们也来举例测试一下,
创建一个Dog类
@Component
public class Dog{
public Dog(){
System.out.println("dog constructor...");
}
//对象创建并赋值之后调用
@PostConstruct
public void init(){
System.out.println("Dog....@PostConstruct...");
}
//容器移除对象之前
@PreDestroy
public void detory(){
System.out.println("Dog....@PreDestroy...");
}
}
依旧使用上面的测试方法进行测试
输出结果如下
dog constructor...
Dog....@PostConstruct...
容器创建完成...
Dog....@PreDestroy...
四、 小结
以上我们介绍了三种方法对容器中的对象进行初始化和销毁,这只是spring容器中bean生命周期的一小小部分。
这三种方法可以组合进行使用,即Combining lifecycle mechanisms
当组合使用时,那这三种方法的执行顺序是什么呢?
我们不再测试,直接看spring官方文档:
Multiple lifecycle mechanisms configured for the same bean, with different initialization methods, are called as follows:
初始化顺序
- Methods annotated with
@PostConstruct afterPropertiesSet()as defined by theInitializingBeancallback interface- A custom configured
init()method
Destroy methods are called in the same order:
销毁顺序:
- Methods annotated with
@PreDestroy destroy()as defined by theDisposableBeancallback interface- A custom configured
destroy()method
七、spring生命周期之初始化和销毁方法的更多相关文章
- 生命周期(初始化、销毁方法、BeanPostProcessor后处理Bean)
1.初始化和销毁 在目标方法执行前后进行初始化或销毁 (1)在Service方法的实现类里面创建初始化方法和销毁方法: public class StudentServiceImpl implemen ...
- Spring的几种初始化和销毁方法
一 指定初始化和销毁方法 通过@Bean指定init-method和destroy-method: @Bean(initMethod="init",destroyMethod=&q ...
- Spring学习笔记之初始化和销毁方法的调用次序
Multiple lifecycle mechanisms configured for the same bean, with different initialization methods, a ...
- 12、生命周期-@Bean指定初始化和销毁方法
12.生命周期-@Bean指定初始化和销毁方法 Bean的生命周期:创建->初始化->销毁 容器管理bean的生命周期 我们可以自定义初始方法和销毁方法,容器在bean进行到当期那生命周期 ...
- 说下spring生命周期
面试官:说下spring生命周期 程序员:不会 那你先回去等消息吧 Bean实现了BeanNameAware,Spring会将Bean的ID透传给setBeanName java.后端开发.程 ...
- Spring生命周期详解
导读 Spring中Bean的生命周期从容器的启动到停止,涉及到的源码主要是在org.springframework.context.support.AbstractApplicationContex ...
- Spring学习总结(4)-Spring生命周期的回调
参考文档:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans ...
- 【源码】spring生命周期
一.spring生命周期 1. 实例化Bean 对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用crea ...
- spring通过注解注册bean的方式+spring生命周期
spring容器通过注解注册bean的方式 @ComponentScan + 组件标注注解 (@Component/@Service...) @ComponentScan(value = " ...
随机推荐
- jQuery的下载以及使用
一.概述 1.版本选择 jquery官网 jQuery的版本有很多,大家在选择版本的时候,一般原则是越新越好,但其实不然,jQuery版本是在不断进步和发展的,最新版是当时最高技术水平,也是最先进的技 ...
- django-使用类视图
视图函数views.py中 from django.shortcuts import render, redirect from django.http import HttpResponse, Js ...
- 使用docker 实现MySQL主从同步/读写分离
1. 利用 docker 实现 mysql 主从同步 / 读写分离 为了保证数据的完整和安全,mysql 设计了主从同步,一个挂掉还可以用另个.最近重构论坛,想来改成主从吧.担心失误,就先拿 dock ...
- svn项目迁移至gitlab
关于svn项目迁移有人可能会说,新建一个git项目,把原来的代码直接扔进去提交不完了吗.恩,是的,没错.但是为了保留之前的历史提交记录,还是得做下面的步骤 首先确保本地正常安装配置好git,具体步骤不 ...
- 【后缀数组】【SP1811】 LCS - Longest Common Substring
题目链接 题意翻译 输入2 个长度不大于250000的字符串,输出这2 个字符串的最长公共子串.如果没有公共子串则输出0 . 思路 求两个串的最长公共子串 代码 #include<iostrea ...
- javascript使用history api防止|阻止页面后退
奇葩需求啥时候都会有,最近有个需求是不允许浏览器回退,但是所有页面都是超链接跳转,于是乎脑壳没转弯就回答了做不到,结果尼玛被打脸了,这打脸的声音太响,终于静下心来看了下history api. 先上代 ...
- rust学习(二)
play on line match if #![allow(unused)] fn write_bar(size: u64){ match size{ o => println!(" ...
- QQ for Mac聊天纪录怎么查找??
在你Mac上打开你的QQ,选择任意聊天窗口,打字的上面有6个图表快捷键,第6个就是查看聊天记录的功能键
- manjaro AwesomeWM 上使用双显示器
本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/dual_monitor_manjaro_awesome 安装ma ...
- 求斐波那契数列中的第N个数
递推 递归 1.暴力递归 2.记忆化递归 对比下二者的效率