spring Bean方法的替换

68 篇文章 0 订阅
文章展示了如何在Spring中使用MethodReplacer接口和XML配置来替换第三方类的方法。当旧的类方法不能满足需求但又不便修改时,可以通过定义新类并配置Bean的replaced-method元素来重写方法。OldEraPeople类的方法drink被NewEraPeople类的方法reimplement所替代,实现在不修改原代码的情况下扩展功能。
摘要由CSDN通过智能技术生成

具体情况截图

 

代码如下

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虾米大王

有你的支持,我会更有动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值