Spring(08)——方法注入之替换方法实现
2017-07-12 09:44
465 查看
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()方法的实现为
a与
b相等时则相乘,否则就相加,则我们可以针对该方法提供一个对应的
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来替换
beanA的
add()方法实现,这是通过
replaced-method元素来指定的。其需要指定两个属性,
name和
replacer。
name用来指定需要替换的方法的名称,而
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所写)
相关文章推荐
- Spring 框架中注入或替换方法实现
- JSP开发之Spring方法注入之替换方法实现
- spring注入的方式实现静态方法中使用非静态变量
- Spring-方法注入lookup、方法替换MethodReplacer接口
- spring 初始化时注入bean实现listener的方法
- SPRING.NET 1.3.2 学习20--方法注入之替换方法注入
- spring 方法注入之 方法以替换
- 【Spring实战】基本方法替换和获取器方法注入
- Spring学习----------Bean 的方法注入和方法替换介绍
- 通过字符创调用接口中实现类的方法,SpringBean自动注入,
- 白话Spring(基础篇)---方法注入与方法替换
- Spring -- 控制反转IoC/依赖注入DI的实现
- 关于在Spring下 使用HQL 语句模糊查询的实现方法
- Spring用回调HibernateCallBack方法实现持久层功能
- 在Spring中使用replaced-method来进行方法替换
- 在Spring中使用replaced-method来进行方法替换
- 快速上手Spring--9. Lookup方法注入
- 快速上手Spring--9. Lookup方法注入
- 《pro Spring》学习笔记之Spring HTTP 远程方法调用集成Tomcat实现安全验证
- 在Spring中使用replaced-method来进行方法替换