`
234390216
  • 浏览: 10197088 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:461015
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1772123
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1395776
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:394004
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:678359
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:529415
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1178985
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:462548
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:150282
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:66976
社区版块
存档分类
最新评论

Spring(08)——方法注入之替换方法实现

阅读更多

8方法注入之替换方法实现

Spring提供了一种替换方法实现的机制,可以让我们改变某个bean某方法的实现。打个比方我们有一个bean,其中拥有一个add()方法可以用来计算两个整数的和,但这个时候我们想把它的实现逻辑改为如果两个整数的值相同则把它们相乘,否则还是把它们相加,在不改变或者是不能改变源码的情况下我们就可以通过Spring提供的替换方法实现机制来实现这一要求。

替换方法实现机制的核心是MethodReplacer接口,其中定义了一个reimplement ()方法,我们的替换方法实现的主要逻辑就是在该方法中实现的,具体定义如下:

public interface MethodReplacer {

	/**
	 * Reimplement the given method.
	 * @param obj the instance we're reimplementing the method for
	 * @param method the method to reimplement
	 * @param args arguments to the method
	 * @return return value for the method
	 */
	Object reimplement(Object obj, Method method, Object[] args) throws Throwable;

}

我们可以看到reimplement()方法将接收三个参数,其中obj表示需要替换方法实现的bean对象,method需要替换的方法,args则表示对应的方法参数。针对前面打的比方,假设我们有如下这样一个类定义对应的bean

public class BeanA {

	public int add(int a, int b) {
		return a+b;
	}
	
}
	<bean id="beanA" class="com.app.BeanA"/>

如果我们需要替换add()方法的实现为ab相等时则相乘,否则就相加,则我们可以针对该方法提供一个对应的MethodReplacer的实现类,具体实现如下所示。

public class BeanAReplacer implements MethodReplacer {

	/**
	 * @param obj 对应目标对象,即beanA
	 * @param method 对应目标方法,即add
	 * @param args 对应目标参数,即a和b
	 */
	public Object reimplement(Object obj, Method method, Object[] args)
			throws Throwable {
		Integer a = (Integer)args[0];
		Integer b = (Integer)args[1];
		if (a.equals(b)) {
			return a * b;
		} else {
			return a + b;
		}
	}

}

之后就需要在定义beanA时指定使用BeanAReplacer来替换beanAadd()方法实现,这是通过replaced-method元素来指定的。其需要指定两个属性,namereplacername用来指定需要替换的方法的名称,而replacer则用来指定用来替换的MethodReplacer对应的bean。所以,此时我们的beanA应该如下定义:

	<bean id="beanAReplacer" class="com.app.BeanAReplacer"/>
	<bean id="beanA" class="com.app.BeanA">
		<replaced-method name="add" replacer="beanAReplacer"/>
	</bean>

如果我们的MethodReplacer将要替换的方法在对应的bean中属于重载类型的方法,即存在多个方法名相同的方法时,我们还需要通过在replaced-method元素下通过arg-type元素来定义对应方法参数的类型,这样就可以区分需要替换的是哪一个方法。所以,针对上述示例,我们也可以如下定义:

	<bean id="beanAReplacer" class="com.app.BeanAReplacer"/>
	<bean id="beanA" class="com.app.BeanA">
		<replaced-method name="add" replacer="beanAReplacer">
			<arg-type match="int"/>
			<arg-type match="int"/>
		</replaced-method>
	</bean>

对应方法名的方法只存在一个时,arg-type将不起作用,即Spring此时不会根据arg-type去取对应的方法进行替换,或者换句话说就是当replaced-method指定名称的方法只存在一个时,无论arg-type如何定义都是可以的。

(注:本文是基于Spring4.1.0所写)

1
1
分享到:
评论

相关推荐

    Spring.3.x企业应用开发实战(完整版).part2

    《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用...

    Spring3.x企业应用开发实战(完整版) part1

    《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    在当今Java EE 开发中,Spring 框架是当之无愧的王者。而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    在当今Java EE 开发中,Spring 框架是当之无愧的王者。而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    在当今Java EE 开发中,Spring 框架是当之无愧的王者。而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring ...

    蚂蚁云客服机器人面试答案.docx

    依赖注入的思想是通过反射机制实现的,在实例化一个类时,它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中。 总而言之,在传统的对象创建方式中,通常由调用者来创建被调用者的实例,而在Spring...

    深入浅出struts2

    我在书中还将介绍一些可以提高生产力的方法——包括默认配置项和应当注意的实现特性,可用的多种配置选项和一些开发技术。本书还会就与第三方软件进行集成的话题展开讨论。 2 Don Brown, Struts Ti项目的领导,他在...

    webx3框架指南PDF教程附学习Demo

    完全建立在Spring框架之上,故可运用Spring的所有特性。 • 扩展性 —— Webx 3.0对Spring做了扩展,使Spring Bean不再是“bean”,而是升级成“组件”。一个组件可以扩展另一个组件,也可以被其它组件扩展。这种...

    领域驱动设计与模式实战

    10.3.6 使用了Spring.NET框架的依赖注入 10.3.7 利用PicoContainer.NET进行自动装配 10.3.8 嵌套容器 10.3.9 服务定位器与依赖注入的比较 10.3.10 小结 10.4 面向方面编程 10.4.1 热门话题有哪些 10.4.2 AOP术语定义...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    现在,Java EE 后端与 Flex 前端的接口已经定义好了,要完成 Java EE 后端的接口实现类非常容易,利用 Spring 强大的依赖注入功能,可以通过几行简单的代码完成: 清单 2. FlexServiceImpl class public class ...

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    现在,Java EE 后端与 Flex 前端的接口已经定义好了,要完成 Java EE 后端的接口实现类非常容易,利用 Spring 强大的依赖注入功能,可以通过几行简单的代码完成: 清单 2. FlexServiceImpl class public ...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate 的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统。所以选择Java技术作为blog 的开发工具。 为了增加系统的...

    JAVA上百实例源码以及开源项目

    百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText();...

    JAVA上百实例源码以及开源项目源代码

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Chrome Frame 会把最新版的Chrome Webkit 内核和JavaScript 引擎注入到IE中, IE浏览器将获得Chrome的性能和功能 目录 摘要 I ABSTRACT II 专业名词清单 III 第一章 绪论 1 1.1 研究背景与意义 1 1.2国内外相关...

    基于J2EE框架的个人博客系统项目毕业设计论...

    由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate 的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统。所以选择Java技术作为blog 的开发工具。 为了增加系统的...

Global site tag (gtag.js) - Google Analytics