Spring Bean的生命周期、后置处理器、定义继承
目录:
1.Bean的生命周期
Bean的生命周期可以简单的理解为:Bean的定义——Bean的初始化——Bean的使用——Bean的销毁
在其生命周期里,有两个重要的回调方法,可以在初始化Bean和销毁Bean时调用该方法。
在这两个方法里可以额外做一些操作。
首先准备一个类
public class Category {
//属性
private String name;
SimpleDateFormat df=new SimpleDateFormat("YYYY-MM-dd HH:mm:ss.sss");
//设置该属性的方法
public void setName(String name){
this.name=name;
}
//获取该属性的方法
public void getName(){
System.out.println(name);
}
//初始化回调
public void start(){
System.out.println("Bean开始使用时间:"+df.format(new Date()));
}
//销毁回调
public void destroy(){
System.out.println("Bean销毁时间:"+df.format(new Date()));
}
}
再准备一个测试类
public class TestSpring {
public static void main(String[] args) throws InterruptedException {
AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Category category = (Category) context.getBean("c");
category.getName();
//睡眠1秒,更加明显看出两个方法的区别
Thread.sleep(1000);
context.registerShutdownHook();
}
}
测试类中,需要调用AbstractApplicationContext的registerShutdownHook()方法来确保正常关闭,并且调用相关的销毁的回调方法。
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="c" class="SpringBean.Base.Category" init-method="start" destroy-method="destroy">
<property name="name" value="Hello Word"/>
</bean>
</beans>
配置文件中,需要指定初始化回调的方法和销毁回调的方法。
最后输出的是:
Bean开始使用时间:-- ::21.021
Hello Word
Bean销毁时间:-- ::22.022
2.Bean的后置处理器
后置处理器就是在初始化方法的前后进行额外的操作。
上面的Category方法代码不变,再准备一个针对Category初始化的类,就叫initCategory
public class initCategory implements BeanPostProcessor {
@Override
//会在bean初始化方法前执行
public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
System.out.println("初始化之前执行:"+s);
return o;
}
@Override
//会在bean初始化方法后执行
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
System.out.println("初始化之后执行:"+s);
return o;
}
}
这个类需要实现BeanPostProcessor 接口,并重写其两个方法,方法内就可以写你需要的额外操作。
保持上面的配置文件不变,再加上一句:
<bean class="SpringBean.Base.initCategory"/>
class属性里写上自己的initCategory 类所在的位置
最后输出:
初始化之前执行:c
Bean开始使用时间:-- ::12.012
初始化之后执行:c
Hello Word
Bean销毁时间:-- ::13.013
3.Bean的定义继承
bean的定义可以包含一大堆配置,比如:属性的值,构造函数的参数等。当其他bean需要用到这些设置时,不需要重新配置,只需要继承即可。
继承的用法就相对简单了,在上面代码基础上。可以再添加一个Category2类。内容与Category一样,再添加额外的属性name2和setName2,getName2方法。
并在配置文件中添加如下代码:
<bean id="c2" class="SpringBean.Base.Category2" parent="c">
<property name="name2" value="Hello Word2"/>
</bean>
可以发现,c2中设置了parent属性,继承id为‘c’的bean。
设置属性当中,只设置了name2,并没有设置name的值,但是调用Category2的getName方法,依旧会输出Hello Word
Spring Bean的生命周期、后置处理器、定义继承的更多相关文章
- Spring动态代理及Spring Bean的生命周期
数组添加值 public class DiTest { /** * 数组 */ private String [] arrays; /** * List:集合 */ private List<I ...
- Spring Bean的生命周期 ---附详细流程图及测试代码
一.生命周期流程图: Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean,这其中包含了一系列关键点 假设一个Bean实现了所有的接口,大的概况一下Be ...
- Spring源码之BeanFactoryPostProcessor(后置处理器)
Spring源码之BeanFactoryPostProcessor(后置处理器). 有点水平的Spring开发人员想必都知道BeanFactoryPostProcessor也就是常说的后置管理器,这是 ...
- Spring Bean的生命周期(非常详细)
Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...
- Spring Bean的生命周期详解(转)
Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...
- 15、生命周期-BeanPostProcessor-后置处理器
15.生命周期-BeanPostProcessor-后置处理器 BeanPostProcessor 接口 package org.springframework.beans.factory.confi ...
- Spring(三)--Spring bean的生命周期
Spring bean的生命周期 ApplicationContext Bean生命周期流程 1.需要的实体类 ackage com.xdf.bean; import org.springframew ...
- 第37讲 谈谈Spring Bean的生命周期和作用域
在企业应用软件开发中,Java 是毫无争议的主流语言,开放的 Java EE 规范和强大的开源框架功不可没,其中 Spring 毫无疑问已经成为企业软件开发的事实标准之一.今天这一讲,我将补充 Spr ...
- Spring学习手札(四)谈谈Spring Bean的生命周期及作用域
在Spring中,那些组成应用程序的主体以及由Spring IoC容器所管理的对象,被称之为Bean.Bean与应用程序中其他对象(比如自己创建类)的区别就是,Bean是由IoC容器创建于销毁的.在S ...
- 谈谈Spring bean的生命周期(一)
简介 本片文章主要讲Spring IOC容器中 bean 的生命周期 Spring bean 生命周期 Spring 中bean的声明周期 可以分为如下4个阶段: 实例化阶段--Instantiati ...
随机推荐
- [BZOJ1694/1742/3074]The Cow Run 三倍经验
Description John养了一只叫Joseph的奶牛.一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草.我们可 以认为草地是一个数轴上的一些点.Joseph看到这些草非常兴奋, ...
- java学习6-java基础类库
1.与用户互动 2.系统相关 3.常用类 4.日期.时间类
- 17.Linux高可用之Keepalived
1.什么是高可用,为什么要设计高可用? 两台机器启动着相同的业务系统,当有一台机器宕机,另外一台服务器能快速的接管,对于访问的用户是无感知的. 减少系统不能提供服务的时间. 2.高可用使用什么工具来实 ...
- java23种设计模式(三)单例模式
原文地址:https://zhuanlan.zhihu.com/p/23713957 一.概述 1.什么是单例模式? 百度百科是这样定义的:单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个 ...
- 百万年薪python之路 -- 内置函数二 -- 最常用的内置函数
1.内置函数 1.1 匿名函数 匿名函数,顾名思义就是没有名字的函数(其实是有名字的,就叫lambda),那么什么函数没有名字呢?这个就是我们以后面试或者工作中经常用匿名函数 lambda,也叫一句话 ...
- webpack 4 移除 CommonsChunkPlugin,取而代之的是两个新的配置项(optimization.splitChunks 和 optimization.runtimeChunk
默认方式 webpack模式模式现在已经做了一些通用性优化,适用于多数使用者. 需要注意的是:默认模式只影响按需(on-demand)加载的代码块(chunk),因为改变初始代码块会影响声明在HTML ...
- 设计模式(一)Iterator模式
Iterator模式用于在数据集合中按照顺序遍历集合.即迭代器模式. 下面来看一段实现了迭代器模式的示例程序. 这段程序的作用是将书(Book)放置到书架(BookShelf)中,并将书的名字按顺序显 ...
- 对于Serializable的理解
对于Serializable的理解 Last Edited: Apr 04, 2019 2:53 PM Tags: java 开始 序列化:把Java对象转换为字节序列的过程. 反序列化:把字节序列恢 ...
- 在docker中创建使用MySQL,并实现远程连接navicat
在 docker 中使用 mysql 安装完docker之后,在命令行中输入docker images可以查看自己创建的image(安装下载docker的教程很多了,大家需要可以去查一下就可以了)这里 ...
- C语言存储类别和链接
目录 C语言存储类别和链接 存储类别 存储期 五种存储类别 C语言存储类别和链接 最近详细的复习C语言,看到存储类别的时候总感觉一些概念模糊不清,现在认真的梳理一下.C语言的优势之一能够让程序员恰 ...