九零后大叔
技术人的点点滴滴

beanfactory篇-(三)lookup-method属性和replace-method属性的基本使用

回顾:通过前面一个章节的了解,我们对spring有了一个基本的了解。我们知道了一个beanfactory或者applicationcontext对象就是一个spring容器,而创建一个beanfactory对象或者applicationcontext对象的过程就是等同于启动了一个spring容器的过程()。我们还了解了spring的很多的注解,这些常用的注解基本上涵盖了日常我们开发的所有场景。在了解源码之前,我们先学会我们不常用的属性功能,为后续了解源码打基础。本章节我们将先了解lookup-method和replace-method两个属性的使用。


1. lookup-method和replace-method的基本介绍

lookup-method:引用 “Spring In Action ” 中的一句话:“获取器注入是一种特殊的方法注入,它是把一个方法声明为返回某种类型的bean,但实际上,返回的bean是配置文件里面配置的,此方法可用在设计一些可插拔的功能上,解除程序依赖”。简而言之就是说lookup-method可以指定一个业务beanA的某个方法A创建另一个业务beanB出来,这种指定可以在applicationContext.xml文件种进行灵活的配置。

replace-method:该标签的功能用于将某个业务beanA的methodA,动态的修改为beanB的methodB。框架启动后,当用户调用业务beanA的methodA方法的时候,实际上执行的是业务beanB的methodB方法。


2. lookup-method和replace-method的的基本使用

[1] lookup-method的基本使用
第一步:创建一个数据源配置类的抽象父类DataSourceConfig如下:

public abstract class DataSourceConfig {

    public abstract void printDataSourceConfig();

}

第二步:创建两个DataSourceConfig的子类-MasterDataSourceConfig和SlaveDataSourceConfig类:

//主数据源配置类
public class MasterDataSourceConfig extends DataSourceConfig {

    @Override
    public void printDataSourceConfig() {
        System.out.println("This is MasterDataSourceConfig.");
    }

}

//从数据源配置类
public class SlaveDataSourceConfig extends DataSourceConfig {

    @Override
    public void printDataSourceConfig() {
        System.out.println("This is SlaveDataSourceConfig.");
    }

}

第三步:创建抽象数据配置管理类DataSourceManger如下:

public abstract class DataSourceManger {

    //打印数据源配置
    public void printDataSourceConfig() {
        this.createDataSourceConfig().printDataSourceConfig();
    }

    //创建一个数据源配置bean(数据源对象)
    public abstract DataSourceConfig createDataSourceConfig();
}

第四步:配置applicationContext.xml文件内容

<!--数据源管理器类-->
<bean id="dataSourceContext" class="com.minesoft.tutorial.config.DataSourceManger">
    <!--选择主数据源-->
    <lookup-method name="createDataSourceConfig" bean="masterDataSourceConfig"/>
    <!--选择从数据源-->
    <!--<lookup-method name="createDataSourceConfig" bean="slaveDataSourceConfig"/>-->
</bean>

<!--主数据源配置类-->
<bean id="masterDataSourceConfig" class="com.minesoft.tutorial.config.MasterDataSourceConfig">
</bean>
<!--从数据源配置类-->
<bean id="slaveDataSourceConfig" class="com.minesoft.tutorial.config.SlaveDataSourceConfig">
</bean>

第五步:运行下面的代码

XmlBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
DataSourceManger dataSourceContext = beanFactory.getBean(DataSourceManger.class);
dataSourceContext.printDataSourceConfig();

测试一:当我们的applicationContext.xml文件配置内容配置的是

<!--选择主数据源-->
<lookup-method name="createDataSourceConfig" bean="masterDataSourceConfig"/>

的时候,运行第五步的代码会打印“This is MasterDataSourceConfig.”,说明当前的DataSourceManger这个bean的指定了createDataSourceConfig方法创建MasterDataSourceConfig这个bean。

测试二:当我们的applicationContext.xml文件配置内容配置的是

<!--选择主数据源-->
<lookup-method name="createDataSourceConfig" bean="slaveDataSourceConfig"/>

的时候,运行第五步的代码会打印“This is SlaveDataSourceConfig.”,说明当前的DataSourceManger这个bean的指定了createDataSourceConfig方法创建SlaveDataSourceConfig这个bean。

总结:也就是说lookup-method可以指定一个业务beanA的某个方法A创建另一个业务beanB出来,这种指定可以在applicationContext.xml文件种进行灵活的配置。




[2] replace-method的的基本使用
第一步:创建一个明星类Celebrity如下:

public class Celebrity {

    public void signContract() {
        //与明星直接签合同
        System.out.println("Sign contract with celebrity.");
    }

}

第二步:创建一个明星经纪人类Broker如下:

public class Broker implements MethodReplacer {

    @Override
    public Object reimplement(Object obj, Method method, Object[] args) throws Throwable {
        //与明星的经纪人签合同
        System.out.println("Sign contract with celebrity`s broker.");
        return null;
    }

}

第三步:配置applicationContext.xml文件内容:

<!--明星Bean-->
<bean id="celebrity" class="com.minesoft.tutorial.delegate.Celebrity">
    <replaced-method name="signContract" replacer="broker" />
</bean>

<!--明星经纪人Bean-->
<bean id="broker" class="com.minesoft.tutorial.delegate.Broker">
</bean>

第四步:运行下面的代码:

XmlBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
Celebrity celebrity = beanFactory.getBean(Celebrity.class);
celebrity.signContract();

运行的打印结果是“Sign contract with celebrity`s broker.”,我们明明调用的是Celebrity的signContract方法,实际上执行的时候确是Broker的reimplement方法。

总结:也就是说replace-method可以在spring启动的过程中,将某个业务beanA的methodA方法替换成为另一个业务beanB的methodB方法。


更多知识请关注公众号

赞(1) 赏一下
未经允许不得转载:九零后大叔的技术博客 » beanfactory篇-(三)lookup-method属性和replace-method属性的基本使用
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

九零后大叔的技术博客

联系我们联系我们

感谢您的支持

支付宝扫一扫打赏

微信扫一扫打赏