beanfactory篇-(三)lookup-method属性和replace-method属性的基本使用-九零后大叔的技术博客

沙海 2021年4月24日09:11:53Java评论52字数 3873阅读12分54秒阅读模式
摘要

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

文章源自JAVA秀-https://www.javaxiu.com/19868.html

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

文章源自JAVA秀-https://www.javaxiu.com/19868.html

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

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

replace-method:该标签的功能用于将某个业务beanA的methodA,动态的修改为beanB的methodB。框架启动后,当用户调用业务beanA的methodA方法的时候,实际上执行的是业务beanB的methodB方法。文章源自JAVA秀-https://www.javaxiu.com/19868.html

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

[1] lookup-method的基本使用
第一步:创建一个数据源配置类的抽象父类DataSourceConfig如下:文章源自JAVA秀-https://www.javaxiu.com/19868.html

public abstract class DataSourceConfig {

    public abstract void printDataSourceConfig();

}

第二步:创建两个DataSourceConfig的子类-MasterDataSourceConfig和SlaveDataSourceConfig类:文章源自JAVA秀-https://www.javaxiu.com/19868.html

//主数据源配置类
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如下:文章源自JAVA秀-https://www.javaxiu.com/19868.html

public abstract class DataSourceManger {

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

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

第四步:配置applicationContext.xml文件内容文章源自JAVA秀-https://www.javaxiu.com/19868.html

<!--数据源管理器类-->
<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>

第五步:运行下面的代码文章源自JAVA秀-https://www.javaxiu.com/19868.html

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

测试一:当我们的applicationContext.xml文件配置内容配置的是文章源自JAVA秀-https://www.javaxiu.com/19868.html

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

的时候,运行第五步的代码会打印“This is MasterDataSourceConfig.”,说明当前的DataSourceManger这个bean的指定了createDataSourceConfig方法创建MasterDataSourceConfig这个bean。文章源自JAVA秀-https://www.javaxiu.com/19868.html

测试二:当我们的applicationContext.xml文件配置内容配置的是文章源自JAVA秀-https://www.javaxiu.com/19868.html

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

的时候,运行第五步的代码会打印“This is SlaveDataSourceConfig.”,说明当前的DataSourceManger这个bean的指定了createDataSourceConfig方法创建SlaveDataSourceConfig这个bean。文章源自JAVA秀-https://www.javaxiu.com/19868.html

总结:也就是说lookup-method可以指定一个业务beanA的某个方法A创建另一个业务beanB出来,这种指定可以在applicationContext.xml文件种进行灵活的配置。文章源自JAVA秀-https://www.javaxiu.com/19868.html

[2] replace-method的的基本使用
第一步:创建一个明星类Celebrity如下:文章源自JAVA秀-https://www.javaxiu.com/19868.html

public class Celebrity {

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

}

第二步:创建一个明星经纪人类Broker如下:文章源自JAVA秀-https://www.javaxiu.com/19868.html

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文件内容:文章源自JAVA秀-https://www.javaxiu.com/19868.html

<!--明星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>

第四步:运行下面的代码:文章源自JAVA秀-https://www.javaxiu.com/19868.html

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方法。文章源自JAVA秀-https://www.javaxiu.com/19868.html

总结:也就是说replace-method可以在spring启动的过程中,将某个业务beanA的methodA方法替换成为另一个业务beanB的methodB方法。文章源自JAVA秀-https://www.javaxiu.com/19868.html

beanfactory篇-(三)lookup-method属性和replace-method属性的基本使用-九零后大叔的技术博客 文章源自JAVA秀-https://www.javaxiu.com/19868.html

更多知识请关注公众号文章源自JAVA秀-https://www.javaxiu.com/19868.html

继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定