在非托管对象中使用Spring托管Bean

即使我们想使用现有的最佳和最新技术,我们也必须处理遗留代码。 想象一下,新代码是用Spring框架的最新技术编写的,而旧代码根本不是用Spring编写的。 然后在非托管Spring对象中使用Spring托管Bean是我们必须处理的模式之一。 遗留代码具有非托管的Spring对象,而我们要引用的代码是Spring托管的Bean。 我们如何解决这个问题?

创建一个Spring Bean

假设我们有一个名为TaxService的托管Spring Bean和一个名为LegacyObject的对象。 LegacyObject是遗留代码,从中可以引用托管Spring Bean上的calculateTax方法。

税务服务

package com.jdriven;import org.springframework.stereotype.Service;@Service
public class TaxServiceImplimplements TaxService {@Overridepublic Double calculateTax(Double price) {return new Double(price * 0.21);}
}

与桥接服务方法的接口

我们定义一个包含方法列表的接口。 这些方法中的每一个都返回一个Spring托管Bean。 我们创建了一个名为getTaxService的方法来返回刚刚创建的TaxService Bean。

SpringContextBridgedServices

package com.jdriven;/*** This interface represents a list of Spring Beans (services) which need to be referenced from a non Spring class.*/
public interface SpringContextBridgedServices {TaxService getTaxService();
}

实施Spring Context Bridge

接下来,我们为SpringContextBridgedServices接口创建一个实现。 让我们将此类SpringContextBridge ,使其成为Spring Bean,并在该类中添加以下功能。

  1. 此类还应实现Spring的ApplicationContextAware接口。 我们需要从接口实现的方法中唯一的参数是参数ApplicationContext 。 我们将此参数保存在静态成员变量中。
  2. 创建一个静态方法以返回SpringContextBridgedServices然后让该方法返回由Spring管理的Bean。 使用applicationContext.getBean(SpringContextBridgedServices.class)返回它。
  3. 自动连接TaxService并将其返回到我们需要从SpringContextBridgedServices方法实现的方法中。

SpringContextBridge

package com.jdriven;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;/**
* Register this SpringContextBridge as a Spring Component.
*/
@Component 
public class SpringContextBridge implements SpringContextBridgedServices, ApplicationContextAware {private static ApplicationContext applicationContext;@Autowiredprivate TaxService taxService; //Autowire the TaxService@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}/*** A static method to lookup the SpringContextBridgedServices Bean in * the applicationContext. It is basically an instance of itself, which * was registered by the @Component annotation.** @return the SpringContextBridgedServices, which exposes all the * Spring services that are bridged from the Spring context.*/public static SpringContextBridgedServices services() {return applicationContext.getBean(SpringContextBridgedServices.class);}@Overridepublic TaxService getTaxService() {return taxService; //Return the Autowired taxService}
}
  • 注意1:有可能以静态方法本身返回Spring托管的bean。 我选择不这样做,因此我的静态方法较少,以后可以模拟一些参考服务。
  • 注2:最终,您希望将这两种功能分开。 一个持有ApplicationContext并返回SpringContextBridgedServices Bean。 另一个是SpringContextBridgedServices Bean本身。 在这个简短的演示中,我只是将它们放在同一个Bean中。

带我去桥

现在是时候打电话给这座桥了。 就像下面的代码所示的那样简单。

传统对象

package com.jdriven;public class LegacyObject {private Double price;public Double doTheCalculation() {//Get the Service from the BridgeTaxService taxService = SpringContextBridge.services().getTaxService();return taxService.calculateTax(this.price);}
}

灵活但不受限制的替代方案

这是限制桥接服务列表的一种方式。 仅SpringContextBridgedServices接口中提到的服务将被桥接。 如果您想要一种更灵活但受控制较少的方法,则可以重写SpringContextBridgedServices

SpringContextBridgedServicesAlternative

package com.jdriven;public interface SpringContextBridgedServicesAlternative {<T> T getService(Class<T> serviceType);
}

现在我们可以通过调用SpringContextBridge.services().getService(TaxService.class)获得服务。 在这种替代方案中,我们无法控制可以桥接哪个Spring托管Bean。

翻译自: https://www.javacodegeeks.com/2015/03/using-spring-managed-bean-in-non-managed-object.html

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

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

相关文章

lda php,主题模型︱几款新主题模型——SentenceLDA、CopulaLDA、TWE简析与实现

[导读]百度最近开源了一个新的关于主题模型的项目。文档主题推断工具、语义匹配计算工具以及基于工业级语料训练的三种主题模型&#xff1a;LatentDirichlet Allocation(LDA)、SentenceLDA 和Topical Word Embedding(TWE)。一、Familia简介帮Familia&#xff0c;打个小广告~ F…

Spring项目中的Netflix Archaius属性

Archaius基础 Netflix Archaius是用于管理应用程序配置的库。 考虑一个属性文件“ sample.properties”&#xff0c;其中包含一个名为“ myprop”的属性&#xff1a; mypropmyprop_value_default这是使用Archaius加载文件的方式&#xff1a; ConfigurationManager.loadCascad…

linux进程之间传递句柄

参考网上的实现&#xff0c;进行了一点改进&#xff0c;本来想用FIFO实现的&#xff0c;后来发现不行&#xff0c;必须使用系统的sendmsg函数&#xff0c;代码格式有点乱&#xff0c;不过功能可以实现&#xff0c;改天有空整理一下~~ 讲究看哈~ #include <sys/types.h>#i…

php 中间代码,PHP内核中用户函数、内部函数和中间代码的转换

昨天和一朋友在邮件中讨论这样一个问题&#xff1a;zend_internal_function&#xff0c;zend_function&#xff0c;zend_op_array这三种结构是可以相互转化的&#xff0c;这三者的转化是如何进行的呢&#xff1f; 以此文&#xff0c;总结。在函数调用的执行代码中我们会看到这样…

Byteman –用于字节码操纵的瑞士军刀

我正在JBoss的许多社区中工作&#xff0c;有很多有趣的事情要谈论&#xff0c;以至于我自己无法将自己的每一分都缠住。 这就是为什么我非常感谢有机会不时地欢迎客座博客的主要原因。 今天是Jochen Mader&#xff0c;他是以代码为中心的书呆子群的一部分。 目前&#xff0c;他…

最短路径问题matlab作图,[MATLAB基础] matlab最短路径的输出问题,用了递归,但程序出错了,请大虾指点...

matlab最短路径的输出问题,用了递归,但程序出错了,请大虾指点 程序如下function shortestpath(w,p,q)c->;l;f;tsize(w);mt(1,1);azeros(m,m);vw;for k1:mfor i1:mfor j1:mb[w(i,j),w(i,k)w(k,j)];w(i,j)min(b);if w(i,j)~v(i,j)a(i,j)k;%a(i,j)10*a(i,j)k;vw;endendendendw;…

快速浏览JAX-RS请求与方法匹配

在本文中&#xff0c;我们来看一下JAX-RS中与资源方法匹配的HTTP请求 。 它是JAX-RS的最基本功能之一。 通常&#xff0c;使用JAX-RS API的开发人员不会接触&#xff08;或真正不需要知道&#xff09; 匹配过程的细节&#xff0c;请放心&#xff0c;由于我们的RESTful&#xff…

$stat php,php stat函数怎么用

php stat函数用于返回关于文件的信息&#xff0c;其语法是fstat(file)&#xff0c;参数file必需&#xff0c;指规定要检查的文件。php stat函数怎么用&#xff1f;定义和用法stat() 函数返回关于文件的信息。语法fstat(file)参数file必需。规定要检查的文件。说明获取由 file 指…

在Java中调用祖父母方法:您不能

在文章保护的重点中&#xff0c;我详细介绍了“受保护”如何扩展“包私有”访问。 我在那儿写道&#xff1a; 你能做的是 覆盖子类中的方法或 使用关键字super调用parent方法。 通常&#xff0c;这实际上是您可以使用受保护的方法完成的所有操作。 &#xff08;请注意&…

Handler(2)

andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。1)Looper: 一个线程可以产生一个Looper对象&#xff0c;由它来管理此线程里的MessageQueue(消息队列)。 2)Handler: 你可以构造Han…

OSGi服务测试助手:ServiceCollector

OSGi服务对于基于松耦合组件的系统开发非常有用。 但是&#xff0c;松散的耦合可能使得难以识别与悬挂服务引用有关的问题。 因此&#xff0c;我们通常运行集成测试以确保运行时服务组件的可用性。 为了减少此类测试所需的样板&#xff0c;我编写了一个简单的实用程序类来获取…

搭建struts2框架

struts是一个经典的MVC模式拦截器比过滤器拦截的力度更大 搭建struts2框架1.引入lib包 9个(2.3版本的)common-fileupload;common-io;common-lang3;common-logging;freemaker;javassistGA;ognl;struts2-core;xwork-core; 2. struts2.xml3. web.xml将所有的跳转都交给struts2处…

adams与matlab联合仿真天线,雷达天线模型MATLAB与ADAMS联合仿真 实验.doc

雷达天线模型MATLAB与ADAMS联合仿真 实验雷达天线模型MATLAB与ADAMS联合仿真实验1.导入雷达天线机械系统模型启动ADAMS&#xff0c;弹出如图1所示的对话框&#xff0c;选择“Open an existing database”,打开保存雷达天线模型的文件夹X:\antenna_test(注&#xff1a;X表示盘符…

【ACM】nyoj_139_我排第几个_201308062046

我排第几个时间限制&#xff1a;1000 ms | 内存限制&#xff1a;65535 KB 难度&#xff1a;3描述 现在有"abcdefghijkl”12个字符&#xff0c;将其所有的排列中按字典序排列&#xff0c;给出任意一种排列&#xff0c;说出这个排列在所有的排列中是第几小的&#xff1f; …

Apache Cassandra和低延迟应用程序

介绍 多年来&#xff0c; Grid Dynamics拥有许多与NoSQL相关的项目&#xff0c;尤其是Apache Cassandra。 在这篇文章中&#xff0c;我们要讨论一个给我们带来挑战的项目&#xff0c;而我们在该项目中试图回答的问题今天也仍然适用。 数字营销和在线广告在2012年很受欢迎&…

php换设备登录逻辑,登录和退出登录的操作逻辑

登录功能的操作逻辑步骤如下&#xff1a;可以分为五个步骤来实现。1、进入页面先判断用户是否已经登录private void isLogin() {//查看本地是否有用户的登录信息SharedPreferences sp this.getActivity().getSharedPreferences("user_info", Context.MODE_PRIVATE);…

Visual studio代码行数统计

Visual studio代码行数统计 Visual Studio中的搜索功能支持正则表达式&#xff08;虽然语法比较诡异&#xff09;&#xff0c;我们完全可以通过正则表达式来遍历整个解决方案从而获得代码行数。 ^:b*[^:b#/].*$ 需要注意&#xff1a;#开头和/开头或者空行都不计入代码量。 如…

在JAX-RS中处理异步请求中的超时

JAX-RS 2.0在客户端和服务器端都支持异步编程范例。 这篇文章重点介绍了使用JAX-RS&#xff08;2.0&#xff09;API在服务器端执行异步REST请求时的超时功能 无需过多介绍&#xff0c;这里是一个快速概述。 为了以异步方式执行方法&#xff0c;您只需 需要指定AsyncResponse接…

strspn php,php返回在字符串中包含 charlist 参数中指定的字符数目的函数strspn()

实例返回在字符串 "Hello world!" 中包含字符 "kHlleo" 的数目&#xff1a;<?php echo strspn("Hello world!","kHlleo");?>定义和用法strspn() 函数返回在字符串中包含 charlist 参数中指定的字符数目。提示&#xff1a;请使…

Java十大简单性能优化

关于“ web scale ”这个流行词有很多炒作&#xff0c;人们花了很多时间来重新组织他们的应用程序体系结构&#xff0c;以使其系统“规模化”。 但是什么是扩展&#xff0c;我们如何确保可以扩展&#xff1f; 缩放的不同方面 上面提到的炒作主要是关于扩展负载 &#xff0c;即…