1: análisis
Para lograr el efecto de reemplazar dinámicamente un determinado método de un bean, puede realizar la función de cambiar la lógica de ejecución sin modificar el código.
2: Ejemplos
2.1: Definir la clase del método a reemplazar
public class ReplacedMethodCls {
public void sayHi() {
System.out.println("hi from old method");
}
}
2.2: Definir la clase de reemplazo
org.springframework.beans.factory.support.MethodReplacer
Es necesario implementar la interfaz. El código fuente de la interfaz es el siguiente:
public interface MethodReplacer {
Object reimplement(Object obj, Method method, Object[] args) throws Throwable;
}
La única forma reimplement
es que se ejecute el nuevo método, simplemente escriba la nueva lógica aquí. Descripción de parámetros:
obj:通过cjlib动态生成的被替换方法所在bean的子类。
method:被替换的方法对象。
args:执行方法需要的参数。
public class MyReplacedMethod implements MethodReplacer {
@Override
public Object reimplement(Object obj, Method method, Object[] args) throws Throwable {
System.out.println("hi from new method");
return null;
}
}
2.3: Archivo de configuración
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 定义method replacer -->
<bean id="myReplacedMethod" class="yudaosourcecode.replacedmethod.MyReplacedMethod"/>
<!-- 定义被替换方法的bean -->
<bean id="replacedMethodCls" class="yudaosourcecode.replacedmethod.ReplacedMethodCls">
<!--
name:被替换的方法
replacedMethodCls:替换方法所在类的bean名称,即实现了MethodReplacer接口的类
-->
<replaced-method name="sayHi" replacer="myReplacedMethod"/>
</bean>
</beans>
2.4: Código de prueba
@Test
public void testReplacedMethod() {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("classpath:testreplacedmethod.xml");
ReplacedMethodCls replacedMethodCls = ac.getBean("replacedMethodCls", ReplacedMethodCls.class);
replacedMethodCls.sayHi();
}
correr:
hi from new method
Process finished with exit code 0
Se <replaced-method name="sayHi" replacer="myReplacedMethod"/>
comentará y, cuando se ejecute, podrá ver que no se reemplazará, pero se llamará al método original:
hi from old method
Process finished with exit code 0