Spring框架:三种Spring Bean生命周期技术

当使用术语“生命周期”时,Spring的家伙指的是您的bean的构造和破坏,通常这与Spring Context的构造和破坏有关。 在某些情况下,Bean生命周期的管理不是一件容易的事,因为需要它执行自己的内部设置。 当您的bean必须与外部系统进行交互时,通常包括:加载文件,打开套接字或从数据库中读取一些数据,这通常是正确的。 它到底有什么关系,要解决这个问题,您所需要的只是让Spring在加载Spring Context并将其关闭时调用您的bean。

为此,Spring提供了三种在初始化和关闭期间调用代码的方式。 这些是:

  • 以编程方式,通常称为“接口回调”。
  • 以每个bean为基础进行声明,称为“方法回调”。
  • 通过对所有bean应用相同的默认方法回调进行声明。

接口回调是我之前所描述的。 但是,为了总结该技术并确保Spring在设置和删除Spring Context期间调用您的bean,您的bean必须实现特定的接口。 在初始化的情况下,它是InitializingBean ;在关闭的情况下,它是DisposableBean 。 如果您需要更多有关这些技术的知识,那么这里是有关InitializingBean的博客和有关DisposableBean 的博客 。

我实际上认为“方法回调”这个名称有些误导,因为它并未真正描述正在发生的事情。 使用方法回调时,您正在做的是将方法添加到bean中,然后在XML配置中引用该方法。 当Spring读取配置文件时,它会发现有一个类型为X的bean,其中有一个方法需要在启动时调用,而另一个方法则需要在关闭时调用。

现在我们需要一个方案,并且因为使用bean回调方法的原因之一是您可以初始化外部系统,所以我建议您正在为一家直销公司工作,并且已经获得编写其中一个烦人的应用程序的工作,该应用程序在半夜拨打随机数字并向接收方播放一条记录的消息,告诉接收方如何通过起诉某家公司来获得意外伤害赔偿(又名现金)他们从未有过。

这个想法是Dialer是一个外部系统,您必须为其编写控制器。 当控制器启动时,它必须连接至拨号器,而在其关闭时,请断开连接。

/*** Dial the number** @param phoneNumber*            the phone number as a string* @return true if the number is dialed successfully*/public boolean dial(String phoneNumber);/*** Play a message*/public void playMessge();/*** Hang up the line...*/public boolean hangUp();

DialerController由上面的接口定义,并且您可以期望它具有一些电话类型的方法,例如playMessage() dial(...)playMessage()hangUp() 。 接下来要做的是创建一个实现这些方法的bean,我将在下面完成。

@Component
public class DialerControllerImpl implements DialerController {private boolean connected;@Overridepublic boolean dial(String phoneNumber) {boolean retVal = false;if (isMiddleOfTheNight()) {testConnection();System.out.println("Dialing number: " + phoneNumber);retVal = true;}return retVal;}private boolean isMiddleOfTheNight() {return true;}@Overridepublic void playMessge() {testConnection();System.out.println("Hello, do not hang up you may be entitled to...");}@Overridepublic boolean hangUp() {testConnection();System.out.println("Hangup!");return true;}public void init() {connected = true;System.out.println("Connect to dialer");}public void destroy() {connected = false;System.out.println("Close connection to dialer");}private void testConnection() {if (connected == false) {throw new RuntimeException("Not connected to external system error");}}
}

playMessage() dial(...)playMessage()hangUp()方法没什么特别的; 他们检查Bean是否已连接到它正在对接的外部拨号程序,然后执行其工作。 此类的有趣之处在于init()destroy()方法,因为这是我们希望Spring在启动和关闭期间分别调用的方法。

为了确保Spring确实调用了我们的bean,我们需要在Spring配置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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"><bean id="dialerController" class="example_2_lifecycle_management.method_based.DialerControllerImpl" init-method="init" destroy-method="destroy" /></beans>

在此示例中,我使用了显式的bean配置(这意味着您可以忽略上面代码中的@Component属性,因为它目前尚未使用,但稍后需要使用),并且需要注意的是bean配置附加属性init-methoddestroy-method 。 这些用于定义Spring初始化和关闭时要调用的bean方法的名称。 在此示例中,它们对应于上面DialerControllerImpl类中的init()destroy()方法。

@Testpublic void testLifeCycle_using_per_bean_declaration() {ctx = new ClassPathXmlApplicationContext("dialer.xml");ctx.registerShutdownHook();instance = ctx.getBean(DialerControllerImpl.class);if (instance.dial("555-1234")) {instance.playMessge();instance.hangUp();}}

上面的代码演示了运行代码的简单单元测试(这不是真正的测试,因为它没有声明任何内容)。 这里要注意的要点是,在创建Spring Application Context之后,我添加了一个调用
registerShutdownHook() 。 这是因为您需要告诉JVM告诉Spring调用您的destroy()方法。 就像我在DisposableBean博客中所做的那样,您可以自己创建和处理shutdown钩子,有时这样做有很多好处,但在以后的日子里,还会有更多好处。

我现在听到的问题是“如果我使用自动装配会怎样?” 事实证明,Spring的Guys在Spring 3.1中添加了一种新的声明性方法回调技术,称为“默认方法回调”。 这里的一个大想法是,您在XML配置文件顶部的<beans/>元素中声明初始化和关闭方法的名称,如下所示:

<?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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"default-init-method="init" default-destroy-method="destroy"><!-- Enable autowiring --><context:component-scan base-package="example_2_lifecycle_management.method_based" /> 
</beans>

选择bean生命周期技术时,请记住Spring专家建议您选择基于方法的回调而不是基于接口的回调。 原因是在选择接口回调路由时,您将bean绑定到了Spring。 这可能是(也可能不是)问题,而这实际上取决于您的应用程序的其余部分,因为使用其他许多Spring技术也会将您的应用程序绑定到Spring。

参考: Spring框架: Captain Debug博客博客中来自JCG合作伙伴 Roger Hughes的三种Spring Bean生命周期技术 。

翻译自: https://www.javacodegeeks.com/2013/02/spring-framework-three-spring-bean-lifecycle-techniques.html

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

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

相关文章

wincc客户机打开服务器文件通讯不上,wincc客户机连不上服务器

如果你计算机名称改正确了&#xff0c;检查一下安装OPC服务软件吗&#xff1f;比如SIMATIC NET。然后试一试下面方法能否解决:首先&#xff0c;设置一下PG/PC接口。方法:开始--设置--控制面板--设置PG/PC接口&#xff0c;在接口分配参数&#xff0c;选择你要的参数(根据你的情…

笔记《精通css》第2章 选择器,注释

第2章 选择器&#xff0c;注释 1.常用选择器&#xff08;id选择器&#xff0c;类选择器&#xff0c;类型选择器&#xff0c;后代选择器&#xff0c;伪类选择器&#xff08;文档结构之外&#xff09;&#xff09; 通用选择器&#xff08;*{ }&#xff09; 高级选择器&a…

Android ios嵌套web页面

我们现在做一个活动页面&#xff0c;Android和ios的活动页面用web来做&#xff0c;方便更改&#xff0c;下面有几个小问题&#xff1b; 1、在Android和ios中&#xff0c;虽然web上面可以存localstorage&#xff0c;但是到了Android和ios上面就失效了&#xff0c;也就是说不能存…

课程学习:程序设计与算法

基本单位 0-1: 1位(2^12), 比特, bit(b)字节: 8位(2^8256), byte(B);1KB: 2^10字节(2^13位)ASCII编码方案就是用一个字节表示一个字母&#xff0c;数字或标点进制转换 十进制->n进制: A0xk^0....AnxK^nn进制->十进制: 取余数(从右往左)十六进制->二进制: 4进制对应1十…

css3点击会移动到点,CSS3过渡点击事件

根据CSS3过渡&#xff1a;div{transition-property: width;transition-duration: 1s;transition-timing-function: linear;transition-delay: 2s;}transition-property&#xff1a;指定应用转换的CSS属性的名称.transition-duration&#xff1a;定义转换所需的时间长度.默认值为…

通过JAX-WS Provider在Web服务中利用MOXy

在先前的文章中&#xff0c;我演示了如何将EclipseLink JAXB&#xff08;MOXy&#xff09;直接集成到WebLogic&#xff08;从12.1.1开始&#xff09;和GlassFish&#xff08;从3.1.2开始&#xff09;的JAX-WS实现中 。 在本文中&#xff0c;我将演示如何通过使用JAX-WS Provide…

python如何获取url中的内容_python怎么提取url中的参数

目标&#xff1a;结果&#xff1a;{tma_jssdk_version: 1.93.0.1, ac: WIFI, appTheme: dark}代码&#xff1a;import urllib.parse as urlparseurl https://search5-search-hl.amemv.com/aweme/v1/challenge/search/?tma_jssdk_version1.93.0.1&acWIFI&appThemedark…

子元素的margin-top会影响父元素

---恢复内容开始--- 之前在写项目的时候&#xff0c;发现原本想让父子元素之间加点边距&#xff0c;却让父元素产生了margin-top&#xff0c;于是百度之后发现了原因。 在css2.1盒模型中 In this specification, the expression collapsing margins means that adjoining ma…

spring boot高性能实现二维码扫码登录(上)——单服务器版

前言 目前网页的主流登录方式是通过手机扫码二维码登录。我看了网上很多关于扫码登录博客后&#xff0c;发现基本思路大致是&#xff1a;打开网页&#xff0c;生成uuid&#xff0c;然后长连接请求后端并等待登录认证相应结果&#xff0c;而后端每个几百毫秒会循环查询数据库或r…

查看 固态硬盘位置_3米防摔+人脸/指纹解锁:西数Armorlock移动固态硬盘

要求快速而又安全的数据拷贝工具&#xff1f;指纹识别移动SSD大家应该都见过了&#xff0c;今天西数推出了一个更为特别的人脸/指纹识别加密移动SSD。G-Technology Armorlock使用AES256全盘加密固态硬盘中的数据&#xff0c;解锁方式不是常见的密码或自带指纹传感器&#xff0c…

CCF - 201403-2 - 窗口

问题描述 试题编号&#xff1a;201403-2试题名称&#xff1a;窗口时间限制&#xff1a;1.0s内存限制&#xff1a;256.0MB问题描述&#xff1a; 问题描述在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。窗口的边界上的点也属于该窗口。窗口之…

通过Spring集成从Hibernate 3迁移到4

本周是时候将我们的代码库升级到最新的Hibernate 4.x了。 我们推迟了迁移&#xff08;仍在Hibernate 3.3上&#xff09;&#xff0c;因为3.x分支的较新维护版本需要对API进行一些更改&#xff0c;这些更改显然仍在不断变化中。 一个示例是UserType API&#xff0c;该API仍然存在…

web前端工程师全套教程免费分享

这是我自己早前听课时整理的前端全套知识点&#xff0c;适用于初学者&#xff0c;也可以适用于中级的程序员&#xff0c;你们可以下载下来。我自认为还是比较系统全面的&#xff0c;可以抵得上市场上90%的学习资料。讨厌那些随便乱写的资料还有拿出来卖钱的人&#xff01;在这里…

vb在服务器上新建文件夹,vb.net-如果不存在,如何在VB中创建文件夹?

vb.net-如果不存在&#xff0c;如何在VB中创建文件夹&#xff1f;我为自己编写了一个小小的下载应用程序&#xff0c;以便我可以轻松地从服务器上获取一组文件&#xff0c;然后将它们全部放入带有全新安装的Windows的新PC上&#xff0c;而无需实际运行网络。 不幸的是&#xff…

mybatis一对一联表查询的两种常见方式

1.一条语句执行查询&#xff08;代码如下图&#xff09; 注释&#xff1a;class表&#xff08;c别名&#xff09;&#xff0c;teacher表&#xff08;t别名&#xff09;teacher_id为class表的字段t_id为teacher表的字段&#xff0c;因为两者有主键关联的原因&#xff0c;c_id为c…

在Windows 7中设置Java开发环境

一段时间以来&#xff0c;我收到了很多愿意尝试Java语言的学生和人们的要求&#xff0c;它们提供了关于如何设置Java开发环境的简单指南&#xff0c;类似于我一年前写的那样。 Mac用户。 看到这里和这里 。 因此&#xff0c;本文主要针对Java开发新手&#xff0c;他们寻求有关使…

写给想成为前端工程师的同学们―前端工程师是做什么的?

前端工程师是做什么的&#xff1f; 前端工程师是互联网时代软件产品研发中不可缺少的一种专业研发角色。从狭义上讲&#xff0c;前端工程师使用 HTML、CSS、JavaScript 等专业技能和工具将产品UI设计稿实现成网站产品&#xff0c;涵盖用户PC端、移动端网页&#xff0c;处理视觉…

逆水寒服务器维护7.5,逆水寒7.26日维护到什么时候 逆水寒7.26日游戏改动汇总介绍...

逆水寒7.26日维护到什么时候 逆水寒7.26日游戏改动汇总介绍2018-07-26 10:08:08来源&#xff1a;游戏下载编辑&#xff1a;苦力趴评论(0)《逆水寒》官方发布微博&#xff0c;称为了保证服务器的运行稳定和服务质量&#xff0c;将于7月26日上午7:00-上午10:00进行停服维护。此次…

是否可以限制蓝牙传输距离_技术文章—关于蓝牙传输范围的常见误解

蓝牙技术在耳机、手机、手表及汽车领域的普及为人们带来了许多便利&#xff0c;却也引发了一些人们对于蓝牙的误解。目前&#xff0c;蓝牙可为多种重要的解决方案提供支持&#xff0c;其中包括家庭自动化、室内导航以及商业和工业创新等。误解一&#xff1a;蓝牙稳定传输的最远…

shell 统计行数

语法&#xff1a;wc [选项] 文件… 说明&#xff1a;该命令统计给定文件中的字节数、字数、行数。如果没有给出文件名&#xff0c;则从标准输入读取。wc同时也给出所有指定文件的总统计数。字是由空格字符区分开的最大字符串。 该命令各选项含义如下&#xff1a; - c 统计字节数…