Arbitrary Method Replacement;replaced-method

官网Arbitrary Method Replacement

个人认为的使用场景:之前的方法不能修改了,所以要替换原来的方法

使用示例

  • MyValueCalculator.java(因为这个类的 computeValue 方法被替换了,所以computeValue 方法根本就没有执行)
public class MyValueCalculator {
    public String computeValue(String input) {
        System.out.println("MyValueCalculator computeValue");
        return input;
    }
}
  • ReplacementComputeValue.java

import org.springframework.beans.factory.support.MethodReplacer;
import java.lang.reflect.Method;

public class ReplacementComputeValue implements MethodReplacer {

    /**
     * 重新实现给定的方法。
     * 得到输入值,用它工作,然后返回一个计算后的结果
     * @param o    我们重新实现方法的实例
     * @param m    重新实现的方法
     * @param args 方法的参数
     * @return 这个方法的结果
     * @throws Throwable
     */
    public Object reimplement(Object o, Method m, Object[] args) throws Throwable {
        System.out.println(o.getClass());  // class org.example.mavenjavademo.spring.MyValueCalculator$$EnhancerBySpringCGLIB$$af2fa846
        System.out.println(m.getName());   // computeValue
        System.out.println(args[0]);      // 你好
        String input = args[0] + "天苍苍野茫茫";
        return input;  // 你好天苍苍野茫茫
    }
}
  • config.xml

<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
        https://www.springframework.org/schema/beans/spring-beans.xsd"
>
    <bean id="myValueCalculator" class="org.example.mavenjavademo.spring.MyValueCalculator">
        
        <replaced-method name="computeValue" replacer="replacementComputeValue">
            <arg-type>Stringarg-type>
        replaced-method>
    bean>

    <bean id="replacementComputeValue" class="org.example.mavenjavademo.spring.ReplacementComputeValue"/>
beans>
  • SpringMain.java
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringMain {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
        MyValueCalculator bean = context.getBean(MyValueCalculator.class);
        System.out.println(bean.computeValue("你好"));
    }
}

你可能感兴趣的:(Spring,spring)