一、初始逻辑
来看下面的示例,具体看注释。
/**
* 假设这是一个表示可以向目标发起连接的类
*/
public class ConnectionExample {
public void execConnection() {
System.out.println("ConnectionExample:连接到谷歌!");
}
}
/**
* 这是一个管理连接的类
*/
public class ConnManager {
/**
* 介绍:通过调用这个方法,可以获取一个连接对象,业务逻辑如方法体 说明:假设这是一个旧系统中遗留的或者第三方插件中默认的业务逻辑,
* 整个类和方法你都不能更改或者更改太麻烦
*/
public ConnectionExample createConnection() {
return new ConnectionExample();
}
}
<!-- 初始使用,我们引入Spring后的配置 -->
<bean id="connManager" class="com.rc.sp.lookup.ConnManager"/>
public class Run {
/**
* 通过ConnManager的createConnection()方法可以获得初始的Connection,
* 调用其execConnection()方法发起初始的连接请求,原有流程完毕
*/
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
ConnManager manager = (ConnManager) context.getBean("connManager");
manager.createConnection().execConnection();
}
}
运行结果:执行Run中的main()方法,控制台输出:ConnectionExample:连接到谷歌!
二、应用拓展
现在,假设需要对Connection做一个拓展,希望可以连接到的目标是自定义的新目标,通过ConnectionExample的createConnection()获取的当然也是拓展的Connection对象。拓展很容易,怎样把这个拓展的Connection在调用createConnection()时取代默认业务逻辑产生的Connection对并返回,才是lookup-method的重点。
/**
* 针对默认的Connection拓展
*/
public class ConnectionExtends extends ConnectionExample {
@Override
public void execConnection() {
System.out.println("ConnectionExtends:连接到百度!");
}
}
<!-- spring配置 -->
<bean id="connectionExtends" class="com.rc.sp.lookup.ConnectionExtends"/>
<bean id="connManager" class="com.rc.sp.lookup.ConnManager">
<!-- 忽略createConnection()方法中的具体业务逻辑,直接返回自定义的bean的对象,但是该bean必须与忽略逻辑的方法返回值执行不冲突 -->
<lookup-method name="createConnection" bean="connectionExtends"/>
</bean>
运行结果:再次执行Run中的main()方法,控制台输出:ConnectionExtends:连接到百度!