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;选择你要的参数(根据你的情…

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

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

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

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

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

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

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;蓝牙稳定传输的最远…

基于webpack搭建的vue element-ui框架

花了1天多的时间&#xff0c; 终于把这个框架搭建起来了。 好了&#xff0c; 不多说了&#xff0c; 直接进入主题了。前提是安装了nodejs,至于怎么安装&#xff0c; 网上都有教程。 这里就不多说了&#xff0c; 这边使用的IDE是idea。1.在E:/my-project&#xff08;我的电脑上&…

编译打包vue_Vue 源码分析( 一 )

Vue 源码分析&#xff08; 一 &#xff09;目录结构、版本、入口1、Vue 源码目录结构dist&#xff1a;打包之后生成的结果目录 examples&#xff1a;代码示例 scripts&#xff1a;配置文件 src&#xff1a;源代码目录compiler: 编译相关 &#xff08;将template模板转换成rende…

使用grep4j轻松测试分布式组件上的SLA

因此&#xff0c;您的分布式体系结构如下图所示&#xff0c;您刚刚从企业那里收到了一项要求&#xff0c;以确保生产者发送并随后传输到下游系统&#xff08;消费者&#xff09;的消息的SLA必须快且永远不会慢于此。 400毫秒。 要求说&#xff1a; 从生产者发送到任何消费者的…

Python+Appium环境搭建

1、python环境搭建&#xff0c;这里就不做过多介绍 2、安装 node.js 2.1、官网下载node.js&#xff1a;https://nodejs.org/en/download/ 2.2、获取到安装文件后&#xff0c;直接双击安装文件&#xff0c;根据程序的提示&#xff0c;完成nodejs的安装。 2.3、安装完成后&#x…

以空格为分隔符读取内容给两个变量_问与答61: 如何将一个文本文件中满足指定条件的内容筛选到另一个文本文件中?...

学习Excel技术&#xff0c;关注微信公众号&#xff1a;excelperfectQ&#xff1a;如下图1所示&#xff0c;一个名为“InputFile.csv”文件&#xff0c;每行有6个数字&#xff0c;每个数字使用空格分隔开。图1现在&#xff0c;我要将以60至69开头的行放置到另一个名为“OutputFi…

BZOJ 1008:[HNOI2008]越狱

傻逼题&#xff0c;然后n&#xff0c;m写反了WA了一发。。 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #include<queue> #include<vector> typedef long long LL; using namespac…

属性被分为八大类不包括_Python语言---私有属性

属性分为实例属性与类属性方法分为普通方法&#xff0c;类方法&#xff0c;静态方法一&#xff1a;属性&#xff1a;尽量把需要用户传入的属性作为实例属性&#xff0c;而把同类都一样的属性作为类属性。实例属性在每创造一个实例时都会初始化一遍&#xff0c;不同的实例的实例…

Jenkins分层作业和作业状态汇总

您可能知道&#xff0c;Jenkins是高度可配置的CI服务器。 我们可以设置不同的自定义构建过程。 我将分享一些我用来设置Jenkins工作层次的方法。 这是用例&#xff1a; 我们有一个主入口作业被调用以启动整个构建过程。 这项工作可以有一个到多个子工作。 &#xff08;第2级&…

【Python Programe】WSGI (Web Server Gateway Interface)

Part1: What is a Web server? 一个位于物理服务器上的网络服务器&#xff08;服务器里的服务器&#xff09;&#xff0c;等待客户端去发送request&#xff0c;当服务器接收到request&#xff0c;就会生成一个response发送回客户端&#xff1b; 客户端与服务器使用HTTP协议进…

华大单片机m4内核的滴答定时器_微处理器、单片机及其外设,处理还是控制?...

每项新应用设计都需要一个单片机或微处理器。当在两者之间选择其一时&#xff0c;需要考虑一些因素。以下是微处理器、单片机以及异构架构的概述。考虑选择微处理器(MPU)或者单片机(MCU)时&#xff0c;应用类型通常是关键因素。另一方面&#xff0c;最终选择取决于诸如操作系统…

安装提示卸载office_office2010 卸载工具

点击上方“蓝字”&#xff0c;关注我们获取更多免费资源我们为什么要用这个office2010卸载工具呢&#xff0c;很简单旧版本的office卸载不干净&#xff0c;在安装新版本的office时可能会遇到一些奇奇怪怪的问题。如果遇到无法安装office时&#xff0c;我们可以先使用office卸载…