携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情
上一篇文章及之前的几篇文章介绍了几种规避prototype “陷阱”的方法,这篇文章我们来介绍另外一种处理方式:方法替换。
方法替换的引入
之前我们讲过方法注入的相关概念,方法注入其实只是通过相应方法为主体对象注入依赖对象。
而方法替换更多地是体现在方法的实现层面上,我们考虑,在实现方法的时候,使用方法替换,可以灵活地替换掉原来的实现逻辑;或者直接覆盖掉原来的方法的实现逻辑。
或者换句话说,这种方式可以基本地认为它是帮助我们实现一种简单的方法拦截的功能。(这也算作是AOP 的初级版)
方法替换的使用
假如我们想对某个类中的某个方法做替换,想替换掉它默认逻辑,这个时候,我们就可以使用“方法替换”来完成这个功能。
首先我们给出org.springframework.beans.factory.support.MethodReplacer 的实现类,假如我们只是想加一些文字输出逻辑,代码如下:
public class TestMethodReplacer implements MethodReplacer {
@Override
public Object reimplement(Object obj, Method method, Object[] args) throws Throwable {
System.out.println("before execute emthod");
System.out.println("execute method");
System.out.println("after execute emthod");
return null;
}
}
这个时候我们给出一个用来测试的类:
public void Test {
public Test() {
}
public void dummyMethod() {
System.out.println("12345");
}
}
我们如果想替换掉dummyMethod 方法,就可以使用<replaced-method> 标签,在配置文件中这么写:
<bean id = "testMethodReplacer" class = "xxxxxx.TestMethodReplacer"/>
<bean id = "test" class = "xxxxxx.Test">
<replace-method name = "dummyMethod" replacer = "testMethodReplacer"/>
</bean>
在上面这些步骤完成之后,我们再调用Test 实例中的dummyMethod 方法的时候,就会发现输出的是:
before execute method
execute method
after execute method
最终就是Test 实例里的dummyMethod 已经完全被替换掉了。
但是值得注意的是,这种方式的执行效率并不高,具体原因读者可以自行查阅。
在了解了Spring 的AOP 之后,这个功能却也显得比较鸡肋了,不过读者可以自行权衡。
另外,如果要替换的方法有参数存在,或者对象中有多个重载的方法,那么可以在<replaced-method> 内部通过<arg-type> 来明确指出要替换的方法的参数类型是什么。
总结
以上是“方法替换”的介绍,读者可以试着在实际工作中做一些尝试,看看执行效率怎么样。