具体情况截图

 

spring Bean方法的替换_xml

代码如下

OldEraPeople.java

package com.shrimpking.code14;

public class OldEraPeople
{
    public String drink(String name)
    {
        String str = "";
        return str;
    }
}

 NewEraPeople.java

package com.shrimpking.code14;

import org.springframework.beans.factory.support.MethodReplacer;

import java.lang.reflect.Method;

/**
 * @author user1
 */
public class NewEraPeople implements MethodReplacer
{

    @Override
    public Object reimplement(Object obj, Method method, Object[] args) throws Throwable
    {
        String input = (String)args[0];
        System.out.println("传入参数" + input);
        String newStr = input + "新方法替换内容";
        System.out.println(newStr);
        return newStr;
    }
}

beans.xml

<?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">

    <bean id="newPeople" class="com.shrimpking.code14.NewEraPeople"/>

    <bean id="oldPeople" class="com.shrimpking.code14.OldEraPeople">
        <replaced-method name="drink" replacer="newPeople">
            <arg-type>String</arg-type>
        </replaced-method>
    </bean>
</beans>

DemoTest.java

package com.shrimpking.code14;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DemoTest
{
    @Test
    public void test()
    {
        ApplicationContext context = new ClassPathXmlApplicationContext("/code14/beans.xml");
        OldEraPeople oldEraPeople = context.getBean("oldPeople", OldEraPeople.class);
        oldEraPeople.drink("tom");

    }
}

-----------------------------------------------------------------------------------------------------------------------------

引用:

属性和方法是类的主要组成部分,Spring可以对属性值进行注入配置,也提供了对方法替换的配置。

方法替换配置的使用场景:第三方提供的类方法无法满足应用需求,但是又不想通过反编译改写这个类的方法或此方法还在其他地方使用,就可以配置Bean的replaced-method元素来实现对方法的覆写。

下面以一个实例进行该特性的演示。

有一个类OldEraPeople,包含一个eat()的方法(一般只需要知道该类方法的输入参数和返回类型即可),通过定义一个新的类NewEraPeople,替换旧类的执行方法。

代码如下:

01 public class OldEraPeople { //旧的类定义
02 public String eat(String name){ //旧的类方法,这里仅返回一个空的字串
03 String str = "";
04 return str;
05 }
06 }

新的类需要实现MethodReplacer接口并完成reimplement方法。

代码如下:

//继承MethodReplacer接口的类
01 public class NewEraPeople implements MethodReplacer {
02 @Override //方法重载注解
03 public Object reimplement(Object obj, Method method, Object[] args) throws Throwable {
04 String inputParam = (String)args[0];
05 System.out.println("传入参数:"+inputParam);
06 String newStr = inputParam+"在新时代";
07 System.out.println("替换返回新的字符串或对象");
08 return newStr;
09 }
10 }
在XML中增加新类的Bean配置,并且在旧Bean配置中通过元素配置方法替换,replacer是新方法的Bean的ID,name指定需要替换的方法,如下:
01  <bean id="oldEraPeople" class="cn.osxm.ssmi.chp4.methodinj.OldEraPeople">      
<!--方法替换配置 -->
02      <replaced-method name="eat" replacer="newEraPeople">
03          <arg-type>String</arg-type>
04          </replaced-method>
05  </bean>
06  <bean id="newEraPeople" class="cn.osxm.ssmi.chp4.methodinj.NewEraPeople"/>