视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
JSP开发之Spring方法注入之替换方法实现
2020-11-27 20:05:42 责编:小采
文档

这篇文章主要介绍了JSP开发之Spring方法注入之替换方法实现的相关的JSP资料,对JSP感兴趣的朋友可以参考下本篇文章

JSP开发之Spring方法注入之替换方法实现

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如何定义都是可以的。

下载本文
显示全文
专题