1、初始邏輯:首先,來看下面的示例,具體看註釋。
java
/** * 假設這是一個表示能夠向目標發起鏈接的類 */ publicclassConnectionExample { publicvoidexecConnection() { System.out.println("ConnectionExample:鏈接到谷歌!"); } }
/** * 這是一個管理鏈接的類 * @author Administrator * */ publicclassConnManager { /** * 介紹:經過調用這個方法,能夠獲取一個鏈接對象,業務邏輯如方法體 * 說明:假設這是一箇舊系統中遺留的或者第三方插件中默認的業務邏輯, * 整個類和方法你都不能更改或者更改太麻煩 */ publicConnectionExample createConnection(){ returnnewConnectionExample(); } }
<!-- 初始使用或者咱們引入Spring後的配置 --> <beanid="connManager"class="com.rc.sp.lookup.ConnManager"/>
publiccla***un { /** * 經過ConnManager的createConnection()方法能夠得到初始的Connection, * 調用其execConnection()方法發起初始的鏈接請求,原有流程完畢 */ publicstaticvoidmain(String[] args) { ApplicationContext context = newClassPathXmlApplicationContext( "applicationContext.xml"); ConnManager manager = (ConnManager) context.getBean("connManager"); manager.createConnection().execConnection(); } }
運行結果:執行Run中的main()方法,控制檯輸出:ConnectionExample:鏈接到谷歌!spring
2、應用拓展:如今,假設須要對Connection作一個拓展,但願能夠鏈接到的目標是自定義的新目標,經過ConnectionExample的createConnection()獲取的固然也是拓展的Connection對象。拓展很容易,怎樣把這個拓展的Connection在調用createConnection()時取代默認業務邏輯產生的Connection對並返回,纔是lookup-method的重點。app
/** * 針對默認的Connection拓展 */ publicclassConnectionExtends extendsConnectionExample { @Override publicvoidexecConnection() { System.out.println("ConnectionExtends:鏈接到百度!"); } }
<!-- spring配置 --> <beanid="connectionExtends"class="com.rc.sp.lookup.ConnectionExtends"/> <beanid="connManager"class="com.rc.sp.lookup.ConnManager"> <!-- 忽略createConnection()方法中的具體業務邏輯,直接返回自定義的bean的對象, 可是該bean必須與忽略邏輯的方法返回值執行不衝突 --> <lookup-methodname="createConnection"bean="connectionExtends"/> </bean>
運行結果:再次執行Run中的main()方法,控制檯輸出:ConnectionExtends:鏈接到百度!ide