文章源自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
文章源自JAVA秀-https://www.javaxiu.com/19868.html
更多知识请关注公众号文章源自JAVA秀-https://www.javaxiu.com/19868.html

评论