将Spring集成到旧版应用程序中

所有Spring开发人员喜欢做的事情之一就是将Spring塞入他们正在工作的任何应用程序中–这是我生活中的罪恶感之一:您看到一些代码,认为它是垃圾,因为它包含几个众所周知的反模式,然后想想如果这个应用程序是Spring应用程序会多么酷。

使用旧版代码时,您无法在一夜之间将其转换为功能完善的Spring应用程序。 您需要做的是一次添加一点Spring代码:一步一步地完成,有一种很好的方法。

在以下场景中,您正在处理一些旧代码,并且编写了一个名为: MySpringBean的Spring bean,它需要使用旧类: LegacyAppClass

遗留类如下所示:

public class LegacyAppClass {// some old code goes herepublic void legacyDoSomethingMethod() {System.out.println("This is so old it doesn't use a logger....");}
}

…虽然您的新SpringBean如下所示:

public class MySpringBean {private LegacyAppClass injectedBean;@Overridepublic String toString() {return "The toString()";}public LegacyAppClass getInjectedBean() {return injectedBean;}public void setInjectedBean(LegacyAppClass injectedBean) {this.injectedBean = injectedBean;}public void myDoSomethingMethod() {injectedBean.legacyDoSomethingMethod();}}

…如您所见, myDoSomethingMethod ()方法需要调用旧版legacyDoSomethingMethod ()方法。

鉴于任何遗留应用程序都有其创建各种对象的方式,并且您的新Spring代码将需要使用这些对象来完成其工作,那么您需要一种将遗留对象与闪亮的新对象组合的方式。 这通常涉及将遗留对象添加到您的Spring Context中,并将它们注入到您的对象中,为此,您需要Spring的StaticApplicationContext

@Testpublic void loadExternalClassTest2() {LegacyAppClass myInstance = new LegacyAppClass();GenericApplicationContext parentContext = new StaticApplicationContext();parentContext.getBeanFactory().registerSingleton("injectedBean",myInstance);parentContext.refresh(); // seems to be required sometimesApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "SpringIntegrationExample.xml" }, parentContext);MySpringBean mySpringBean = context.getBean(MySpringBean.class);assertNotNull(mySpringBean);mySpringBean.myDoSomethingMethod();System.out.println(mySpringBean.toString());}

在上面的测试代码中,要注意的第一点是,我创建了一个供测试使用的LegacyAppClass实例,但是在实际应用中,这已经在您的旧代码库中的某个位置创建了。 接下来的三行是魔术发生的地方……

GenericApplicationContext parentContext = new StaticApplicationContext();parentContext.getBeanFactory().registerSingleton("injectedBean",myInstance);parentContext.refresh(); // seems to be required sometimes

…在上面的代码段中,您可以看到我正在创建一个StaticApplicationContext ,然后向其中实用地添加了我的旧类实例。

ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "SpringIntegrationExample.xml" }, parentContext);

如上所示,最后的任务是使用适合您的项目的任何方法来创建新的Spring应用程序上下文。 在这种情况下,我使用了众所周知的ClassPathXmlApplicationContext,但其他类型的应用程序上下文也可以正常工作。

您可能会说这是一个简单的Micky-Mouse示例,但是从经验来看,它的扩展性很好。 作为Martin Fowler的Strangler Pattern实现的一部分,目前有两个完整的旧式JSP Front Strategy MVC应用程序正在使用它(在我于去年10月的博客中详细介绍了它,名为Everybody Knows About MVC )。

最后,出于完整性考虑,下面是此示例的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.0.xsd"><bean id="mySpringBean" class="miscillaneous.springintegration.MySpringBean"><property name="injectedBean" ref="injectedBean"/></bean>
</beans>

参考: JCG合作伙伴 Roger Hughes的 将Spring集成到旧版应用程序中   在Captain Debug的Blog中 。


翻译自: https://www.javacodegeeks.com/2012/03/integrating-spring-into-legacy.html

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

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

相关文章

java自己实现ioc_springioc原理、springmvc项目分析、自己实现IOC

从一个面试题开始&#xff1a;你自己实现IOC容器的话&#xff0c;保存bean你会使用什么数据结构来保存呢&#xff1f;现在的很多开发人员(甚至3年以上的)不一定能回答这问题&#xff0c;为什么会这样呢&#xff1f;这个跟现在springboot现在已经高度成熟了&#xff0c;很多配置…

实现两级下拉框的联动

1.实现两级下拉框的联动。 功能&#xff1a;实现点击年级下拉框&#xff0c;加载对应科目的下拉框。 第一步&#xff1a;首先要加载年级下拉框中的数据。 01.在GradeDAL层&#xff08;数据访问层&#xff09;写一个方法&#xff0c;查询所有年级的信息。 /// <summary>//…

System.nanoTime()背后是什么?

在Java世界中&#xff0c;对System.nanoTime&#xff08;&#xff09;的理解非常好。 总有一些人说它是快速&#xff0c;可靠的&#xff0c;并且在可能的情况下&#xff0c;应该使用它代替System.currentTimemillis&#xff08;&#xff09;进行计时。 总的来说&#xff0c;他绝…

python连接SQL Server取多个结果集:Pymssql模块

基本的用法可以参考&#xff1a;python连接SQL Server&#xff1a;Pymssql模块 和上一篇文章中的代码&#xff0c;只取一个结果集不同&#xff0c;这次会一次运行2个sql语句&#xff0c;然后分别取出2个结果集&#xff0c;打印输出。 代码中有详细的注释&#xff0c;一看就明白…

状态不属于代码

Web应用程序中的“状态”是什么&#xff1f; 它就是要存储的数据&#xff08;无论目的地是什么—内存&#xff0c;数据库&#xff0c;文件系统&#xff09;。 应用程序本身不得在代码中存储任何状态。 这意味着您的类应仅包含带有无状态对象的字段。 换句话说&#xff0c;在程序…

Xen安全架构sHype/ACM策略配置图文教程

实验要求 1. 熟悉Xen虚拟化平台部署&#xff1b; 2. Xen sHype/ACM安全架构中的Simple TE和Chinese Wall策略及事实上现机制的分析与验证。 第1章 Xen环境部署 1.1 版本号选择 因为Ubuntu使用广泛。软件包易于下载。我们选择Ubuntu系统进行Xen部署…

Python 辨异 —— __init__ 与 __new__

__init__ 更多的作用是初始化属性&#xff0c;__new__ 进行的是创建对象&#xff0c;显然 __new__ 要早于 __init__ 发生。 考虑一个继承自 tuple 的类&#xff0c;显然在 __init__ 无法对其成员进行修改&#xff1b; class Edge(tuple):def __new__(cls, e1, e2):return tuple…

java弹出虚拟键盘_JS实现电脑虚拟键盘的操作

本文实例为大家分享了JS实现电脑虚拟键盘的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下需求&#xff1a;1.当输入框光标聚焦时&#xff0c;电脑虚拟键盘弹出2.在输入框输入内容时&#xff0c;键盘跟着变化具体实现代码如下&#xff1a;Html部分&#xff1a;电脑键…

Apache Mahout:入门

最近&#xff0c;我有一个有趣的问题要解决&#xff1a;如何使用自动化对不同来源的文本进行分类&#xff1f; 前一段时间&#xff0c;我读到一个有关该项目以及许多其他文本分析工作的项目– Apache Mahout 。 尽管它不是一个非常成熟的版本&#xff08;当前版本为0.4 &#x…

Javascript中最常用的55个经典技巧(转)

1. οncοntextmenu"window.event.returnValuefalse" 将彻底屏蔽鼠标右键 <table border οncοntextmenureturn(false)><td>no</table> 可用于Table 2. <body onselectstart"return false"> 取消选取、防止复制 3. οnpaste"…

向数组添加元素 java_java如何向数组里添加元素

向数组里添加一个元素怎么添加&#xff0c;这儿总结有三种方法&#xff1a;1、一般数组是不能添加元素的&#xff0c;因为他们在初始化时就已定好长度了&#xff0c;不能改变长度。但有个可以改变大小的数组为ArrayList&#xff0c;即可以定义一个ArrayList数组&#xff0c;然后…

JBoss Drools –入门

这篇文章是关于我如何掌握JBoss Drools的 。 其背后的原因是&#xff1a;SAP收购了我公司当前的规则引擎&#xff0c;而Drools是我们将寻找的另一种选择&#xff0c;只要有人掌握了概念验证的技能即可。 尽管似乎有大量的文档&#xff0c;但是我总是会通过示例来发现它是有帮助…

android使用bintray发布aar到jcenter

前言 这两天心血来潮突然想把自己的android library的aar放到jcenter里面&#xff0c;这样一来自己便可以在任何时间任何地点通过internet得到自己的library的引用了&#xff0c;况且现在android studio已经默认使用jcenter的repositories作为依赖来源&#xff0c;以前的mavenc…

Java不是文明语言吗?

几周前&#xff0c;我有机会学习iOS编程。 我的老板认为我更像是“计算机科学家”&#xff0c;而不是开发人员&#xff0c;这意味着我可以将自己的知识应用于开发一两个iPad应用程序–我要做的就是学习Objective-C&#xff0c; iOS SDK&#xff1a;到底有多难&#xff1f; 尽管…

PHP 进程详解

PHP 进程详解PHP 进程详解 如下内容从《操作系统精髓与设计原理》中总结提炼得出&#xff0c;删除了大部分对于理解进程有干扰的文字&#xff0c;对进程知识结构进行的梳理。几乎所有内容为按照书本上摘抄下来的&#xff0c;我目前还总结提炼不出像作者这么深刻的见解。那么就先…

35. Search Insert Position

public class Solution {public int searchInsert(int[] nums, int target) {int lennums.length;int i0;for(;i<len;i){if(nums[i]>target)break;}return i;} } 转载于:https://www.cnblogs.com/aguai1992/p/5351442.html

MySQL 后from多个表_MYSQL回顾(多表查询相关)

前言简单的数据我们可以直接从一个表中获取&#xff0c;但在真实的项目中查询符合条件的数据通常需要牵扯到多张表&#xff0c;这就不得不使用多表查询。多表查询分为多表连接查询、符合条件链接查询、子查询。多表连接查询包括内连接、外连接、全连接。符合条件连接查询本质上…

玩! 框架+ Google Guice

在我目前正在工作的项目中&#xff0c;我们开始使用Google Guice。 对于那些不知道的人&#xff0c; Google Guice是一个依赖项注入框架。 依赖项注入背后的基本思想是提供一个它依赖的类&#xff0c;而不是使依赖类负责实例化它所依赖的对象。 Play具有用于整合Guice的模块&am…

java都要caps标点_第 1 章 管理 Java CAPS 用户

第 1 章 管理 Java CAPS 用户在此处列出的主题提供了有关如何管理 Sun JavaTM Composite Application Platform Suite (Java CAPS) 中的用户的信息。如果您有任何问题&#xff0c;请参见 http://goldstar.stc.com/ 中的 Java CAPS Web 站点。管理系统信息库用户此类别包含以下用…

基于OpenCV 的美颜相机推送直播流

程序流程&#xff1a; 1.图像采集 先从opencv&#xff08;2.4.10版本&#xff09;采集回来摄像头的图像&#xff0c;是一帧一帧的 每一帧图像是一个矩阵&#xff0c;opencv中的mat 数据结构。 2.人脸的美化 人脸美化&#xff0c;我们用的皮肤检测&#xff0c;皮肤在颜色空间是特…