(九)Spring教程——ApplicationContext中Bean的生命周期

1.前言

        ApplicationContext中Bean的生命周期和BeanFactory中的生命周期类似,不同的是,如果Bean实现了org.springframework.context.ApplicationContextAware接口,则会增加一个调用该接口方法setApplicationContext()的步骤。

        此外,如果在配置文件中声明了工厂后处理器接口BeanFacotryPostProcessor的实现类,则应用上下文在装载配置文件后、初始化Bean实例之前将调用这些BeanFactoryPostProcessor对配置信息进行加工处理。Spring框架提供了多个工厂后处理器,如CustomEditorConfigurer、PopertyPlaceholderConfigurer等。如果在配置文件中定义了多个工厂后处理器,那么最好让它们实现org.springframework.core.Ordered接口,以便Spring以确定的顺序调用它们。工厂后处理器是容器级的,仅在应用上下文初始化时调用依次,其目的是完成一些配置文件的加工处理工作。

         ApplicationContext和BeanFactory另一个最大的不同之处在于:前者会利用Java反射机制自动识别出配置文件中定义的BeanPostProcessor、InstantiationAwareBeanPostProcessor和BeanFactoryPostProcessor,并自动将它们注册到应用上下文中;而后者需要在代码中通过手工调用addBeanPostProcessor()方法进行注册。这也是为什么在应用开发时普遍使用ApplicationContext而很少使用BeanFactory的原因之一。

       在ApplicationContext中,只需要在配置文件中通过<bean>定义工厂后处理器和Bean后处理器,它们就会按预期的方式运行。

2.创建Car类

        首先,我们对上一篇文章中的Car类稍微修改以下,修改后的代码如下:

package com.example.servlet001.bean;import org.springframework.beans.BeansException;import org.springframework.beans.factory.*;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;// 管理Bean生命周期的接口public class Car implements BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean, ApplicationContextAware {private  String brand;private String color;private int maxSpeed;private BeanFactory beanFactory;private String beanName;public Car(){System.out.println("调用Car()构造函数");}//InitializingBean接口方法@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("调用InitializingBean.afterPropertiesSet()。");}//BeanNameAware接口方法@Overridepublic void setBeanName(String s) {System.out.println("调用BeanName.setBeanName().");this.beanName=s;}//BeanFactoryAware接口方法@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("调用BeanFactoryAware.setBeanFactory()");this.beanFactory=beanFactory;}//DisposableBean接口方法@Overridepublic void destroy() throws Exception {System.out.println("调用DisposableBean.destroy()。");}//通过<bean>的init-method属性指定的初始化方法public void myInit(){System.out.println("调用init-method所指定的myInit(),将maxSpeed设置为240。");this.maxSpeed=240;}//通过<bean>的destroy-method属性指定的销毁方法public void myDestroy(){System.out.println("调用destroy-method所指定的myDestroy()。");}public String getBrand(){return brand;}public void setBrand(String brand){System.out.println("调用setBrand()设置属性。");this.brand=brand;}public String getColor(){return color;}public void setColor(String color){this.color=color;}public int getMaxSpeed(){return maxSpeed;}public void setMaxSpeed(int maxSpeed){this.maxSpeed=maxSpeed;}public void introduce(){System.out.println("brand:"+brand+";color:"+color+";maxSpeed:"+maxSpeed);}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println("这是ApplicationContextAware的setApplicationContext()方法");}}

3.定义工厂后处理器

        定义一个工厂后处理器,MyBeanFactoryPostProcessor.java,该类的代码如下:

package com.example.servlet001;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanDefinition;import org.springframework.beans.factory.config.BeanFactoryPostProcessor;import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;/*** 工厂后处理器*/public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {//对car的brand属性配置信息进行“偷梁换柱”的加工操作@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory bf) throws BeansException {BeanDefinition bd=bf.getBeanDefinition("car1");bd.getPropertyValues().addPropertyValue("brand","奇瑞QQ");System.out.println("调用BeanFactoryPostProcessor.postProcessBeanFactory()");}}

        ApplicationContext在启动时,将首先为配置文件中的每个<bean>生成一个BeanDefinition对象,BeanDefinition是<bean>在Spring容器中的内部表示。当配置文件中所有的<bean>都被解析成BeanDefinition时,ApplicationContext将调用工厂后处理器的方法,因此,有机会通过程序的方式调整Bean的配置信息。在该后处理器中,将car1对应的BeanDefinition进行调整,将brand属性设置为“奇瑞QQ” 。

4.BeanPostProcessror实现类

        此外,还提供了一个BeanPostProcessror实现类,在该类中仅对car Bean进行处理,对配置文件所提供的属性设置值进行判断,并执行相应的“查漏补缺”操作,MyBeanPostProcessor.java的代码如下图所示:

package com.example.servlet001;import com.example.servlet001.bean.Car;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object o, String s) throws BeansException {if(s.equals("car1")){Car car = (Car)o;if(car.getColor() == null){System.out.println("调用MyBeanPostProcessor.postProcessBeforeInitialization(),color为空,设置为默认黑色。");car.setColor("黑色");}}return o;}@Overridepublic Object postProcessAfterInitialization(Object o, String s) throws BeansException {if(s.equals("car1")){Car car = (Car)o;if(car.getMaxSpeed() >= 200){System.out.println("调用MyBeanPostProcessor.postProcessAfterInitialization(),将maxSpeed调整为200。");car.setMaxSpeed(200);}}return o;}}

5.容器级后处理器

      MyInstantiationAwareBeanPostProcessor.java代码如下

package com.example.servlet001;import org.springframework.beans.BeansException;import org.springframework.beans.PropertyValues;import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;import java.beans.PropertyDescriptor;public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {@Overridepublic Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {if("car1".equals(beanName)){System.out.println("MyInstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation");}return null;}@Overridepublic boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {if("car1".equals(beanName)){System.out.println("InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation");}return true;}@Overridepublic PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {if("car1".equals(beanName)){System.out.println("InstantiationAwareBeanPostProcessor.postProcessPropertyValues");}return pvs;}}

6.配置文件

修改resource文件夹下的test.xml配置文件,xml配置文件的内容如下:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"><!--这个brand属性的值将会被工厂处理器更改掉--><bean id="car1" name="car1" class="com.example.servlet001.bean.Car"init-method="myInit"destroy-method="myDestroy"p:brand="红旗"p:maxSpeed="200"/><!--容器级声明周期处理--><bean id="myInstantiationAwareBeanPostProcessor" class="com.example.servlet001.MyInstantiationAwareBeanPostProcessor"></bean><!--注册Bean后处理器--><bean id="myBeanPostProcessor"class="com.example.servlet001.MyBeanPostProcessor"></bean><!--工厂后处理器--><bean id="myBeanFactoryPostProcessor"class="com.example.servlet001.MyBeanFactoryPostProcessor"></bean></beans>

7.结果验证

        创建一个Demo1.java类来测试该配置的运行效果,Demo1.java代码如下图所示:

package com.example.servlet001;import com.example.servlet001.bean.Car;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Demo1 {public static void main(String[] args) {ApplicationContext ac = new ClassPathXmlApplicationContext("test.xml");Car car=(Car)ac.getBean("car1");car.introduce();}}

点击运行后的结果如图所示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/22513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

香橙派 Orange AIpro 测评记录视频硬件解码

香橙派 Orange AIpro 测评记录视频硬件解码 香橙派官网&#xff1a;http://www.orangepi.cn/ 收到了一块Orange Pi AIpro开发板&#xff0c;记录一下我的测评~测评简介如下&#xff1a;1.连接网络2.安装流媒体进行硬件解码测试3.安装IO测试 简介 Orange Pi AI Pro 是香橙派联合…

0基础学习区块链技术——链之间数据同步样例

我们可以在https://blockchaindemo.io/体验这个过程。 创建区块 默认第一个链叫Satoshi(中本聪)。链上第一个区块叫“创世区块”——Genesis Block。后面我们会看到创建的第二条链第一个区块也是如此。 新增链 新创建的链叫Debby。默认上面有一个创世区块。 然后我们让这…

C# 中文字符串转GBK字节的示例

一、编写思路 在 C# 中&#xff0c;将中文字符串转换为 GBK 编码的字节数组需要使用 Encoding 类。然而&#xff0c;Encoding 类虽然默认并不直接支持 GBK 编码&#xff0c;但是可以通过以下方式来实现这一转换&#xff1a; 1.使用系统已安装的编码提供者&#xff08;如果系统…

从实战案例来学习结构化提示词(一)

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识,包括但不限于AI科普,AI工具测评,AI效率提升,AI行业洞察。关注我,AI之…

Python语法详解module1(变量、数据类型)

目录 一、变量1. 变量的概念2. 创建变量3. 变量的修改4. 变量的命名 二、数据类型1. Python中的数据类型2. 整型&#xff08;int&#xff09;3. 浮点型&#xff08;float&#xff09;4. 布尔型&#xff08;bool&#xff09;5. 字符串&#xff08;str&#xff09;6.复数&#xf…

MySQL中所有常见知识点汇总

存储引擎 这一张是关于整个存储引擎的汇总知识了。 MySQL体系结构 这里是MySQL的体系结构图&#xff1a; 一般将MySQL分为server层和存储引擎两个部分。 其实MySQL体系结构主要分为下面这几个部分&#xff1a; 连接器&#xff1a;负责跟客户端建立连 接、获取权限、维持和管理…

[数据集][图像分类]蘑菇分类数据集14689张50类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;14689 分类类别数&#xff1a;50 类别名称:[“agaricus_augustus”,“agari…

流程引擎,灵活设计业务流程的编辑器设计

流程引擎&#xff0c;灵活设计业务流程的编辑器设计

PySpark特征工程(I)--数据预处理

有这么一句话在业界广泛流传&#xff1a;数据和特征决定了机器学习的上限&#xff0c;而模型和算法只是逼近这个上限而已。由此可见&#xff0c;特征工程在机器学习中占有相当重要的地位。在实际应用当中&#xff0c;可以说特征工程是机器学习成功的关键。 特征工程是数据分析…

若依项目部署(Linux2.0)

解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 配置Java环境变量&#xff1a; vim /etc/profile 设置环境变量生效&#xff1a; source /etc/profile 查看一下jdk版本&#xff1a; java -version 解压tomcat tar -zxvf apache-tomcat-8.5.20.tar.gz 防火墙设置&#xff1a; …

一款WPF的小巧MVVM框架——stylet框架初体验

今天偶然知道有一款叫做stylet的MVVM框架&#xff0c;挺小巧的&#xff0c;特别是它的命令触发方式&#xff0c;简单粗暴&#xff0c;让人感觉很神器。所以接下来我要做一个简单的demo&#xff0c;顺便来分享给大家。 本地创建一个WPF项目&#xff0c;此处我使用.NET 8来创建。…

ABB喷涂机器人IRB52维修指导分析

ABB喷涂机器人是一种非常重要的涂装设备&#xff0c;但是它的维护保养工作也必不可少。如果不定期维修保养&#xff0c;可能会导致ABB喷涂机械手故障&#xff0c;影响生产效率和产品质量。 首先&#xff0c;定期检查ABB涂装机器人IRB52喷嘴和喷枪是否正常&#xff0c;这是维修…

【Mac】Downie 4 for Mac(视频download工具)兼容14系统软件介绍及安装教程

前言 Downie 每周都会更新一个版本适配视频网站&#xff0c;如果遇到视频download不了的情况&#xff0c;请搜索最新版本https://mac.shuiche.cc/search/downie。 注意&#xff1a;Downie Mac特别版不能升级&#xff0c;在设置中找到更新一列&#xff0c;把自动更新和自动downl…

kafka-集群-生产消费测试

文章目录 1、集群生产消费测试1.1、消费者消费消息1.2、生产者生产消息 1、集群生产消费测试 1.1、消费者消费消息 [rootlocalhost ~]# kafka-console-consumer.sh --bootstrap-server 192.168.74.148:9095,192.168.74.148:9096,192.168.74.148:9097 --topic my_topic11.2、生…

Renesas MCU之定时器计数功能应用

目录 概述 1 功能介绍 1.1 时钟相关配置 1.2 应用接口 2 FSP配置Project参数 2.1 软件版本信息 2.2 配置参数 2.3 项目生成 3 定时器功能代码实现 3.1 定时器初始化函数 3.2 定时器回调函数 4 功能测试 5 参考文档 概述 本文主要介绍Renesas MCU的定时器功能的基…

使用Python在Word中创建和提取表格

目录 安装Python Word库 使用Python在Word中创建预定义行和列的表格 使用Python在Word中动态创建表格 使用Python在Word中提取表格数据 Word 文档中的表格是一种强大且灵活的数据组织和展示工具&#xff0c;它能将信息以行和列的形式有序地排列&#xff0c;使文档内容更加清…

全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯

资料下载地址&#xff1a;全新STC12C5A60S2单片机LCD19264大屏万年历农历生肖节气节日显示闹钟温湿度台灯 这是旧版 退役拆解了 新版 与电路图所示 共设置4个按键 短按开关台灯 加减键调光 长按进入菜单 1.台灯 加入PCA PWM 调光 STC12C5A60S2的PCA PWM非常好用 设置简单无极…

kubernetes负载均衡---MetalLB

https://github.com/metallb/metallb 参考 &#xff1a; https://mp.weixin.qq.com/s/MBOWfcTjFMmgJFWw-FIk0Q 自建的Kubernetes集群&#xff0c;默认情况下是不支持负载均衡的。当需要提供服务的外部访问时&#xff0c;可使用 Ingress、NodePort等方式。他们都存在一些问题 …

如何把几个pdf文件合成在一个pdf文件

PDF合并&#xff0c;作为一种常见的文件处理方式&#xff0c;无论是在学术研究、工作汇报还是日常生活中&#xff0c;都有着广泛的应用。本文将详细介绍PDF合并的多种方法&#xff0c;帮助读者轻松掌握这一技能。 打开 “轻云处理pdf官网” 的网站&#xff0c;然后上传pdf。 pd…

基于线性回归根据饮食习惯和身体状况估计肥胖水平

目录 1. 作者介绍2&#xff0e;饮食习惯与身体状况数据集介绍3&#xff0e;实验步骤3.1 数据分析3.2 可视化处理数据3.3 导入线性回归模型进行训练3.4 预测结果3.5 完整代码3.5.1 数据分析3.5.2 模型评估 参考文献 1. 作者介绍 刘欢&#xff0c;女&#xff0c;西安工程大学电子…