Análisis del método reemplazado de Spring

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.MethodReplacerEs 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 reimplementes 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

Supongo que te gusta

Origin blog.csdn.net/wang0907/article/details/114325252
Recomendado
Clasificación