戴着假發的程式員 出品
lookup-method标簽
spring應用手冊(第一部分)
lookup-method是spring實作的一種特殊的通過方法注入的方式。
我們看下面的案例:
我們有兩個IAccountDAO接口的實作類:
接口:
/**
* @author 戴着假發的程式員
*
* @description
*/
public interface IAccountDAO {
public int save(String name);
}
兩個實作類:
/**
* @author 戴着假發的程式員
* @description
*/
public class AccountDAO_mysql implements IAccountDAO {
@Override
public int save(String name){
System.out.println("AccountDAO_mysql-save->儲存賬戶:"+name);
return 1;
}
}
/**
* @author 戴着假發的程式員
* @description
*/
public class AccountDAO_oracle implements IAccountDAO {
@Override
public int save(String name){
System.out.println("AccountDAO_oracle-save->儲存賬戶:"+name);
return 1;
}
}
我們有一個抽象的service類,如下:
/**
* @author 戴着假發的程式員
*
* @description
*/
public abstract class AbstractAccountService {
//非抽象的儲存方法
public int save(String name){
System.out.println("AbstractAccountService-save:"+name);
//調用抽象方法擷取IAccountDAO對象
return getAccount().save(name);
};
//抽象方法擷取IAccountDAO
public abstract IAccountDAO getAccount();
}
這裡注意我們的service是一個抽象類,并沒有屬性IAccountDAO。 我們是通過一個抽象方法getAccount()擷取IAccountDAO對象的。(看到這裡肯定蒙圈,繼續看下面的)
配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans default-autowire="byType" xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 注冊accountDAO_oracle -->
<bean id="accountDAO_oracle" class="com.dk.demo1.dao.impl.AccountDAO_oracle"/>
<!-- 注冊accountDAO_mysql -->
<bean id="accountDAO_mysql" class="com.dk.demo1.dao.impl.AccountDAO_mysql"/>
<!--service配置 分别配置兩個 -->
<bean id="accountService_mysql"
class="com.dk.demo1.service.AbstractAccountService">
<!-- 通過lookup-method 通知springgetAccount方法的傳回值是 accountDAO_mysql-->
<lookup-method name="getAccount" bean="accountDAO_mysql"/>
</bean>
<bean id="accountService_oracle"
class="com.dk.demo1.service.AbstractAccountService">
<!-- 通過lookup-method 通知springgetAccount方法的傳回值是 accountDAO_oracle-->
<lookup-method name="getAccount" bean="accountDAO_oracle"/>
</bean>
</beans>
測試:
@Test
public void testLookup(){
ApplicationContext ac =
new ClassPathXmlApplicationContext("applicationContext-demo4.xml");
AbstractAccountService bean1 = (AbstractAccountService) ac.getBean("accountService_mysql");
bean1.save("戴着假發的程式員");
AbstractAccountService bean2 = (AbstractAccountService) ac.getBean("accountService_oracle");
bean2.save("daizhejiafadechengxuyuan");
System.out.println(bean1);
System.out.println(bean1);
}
控制台
通過觀察我們發現幾個問題:
1、AbstractAccountService是一個抽象類,理論上spring無法建立對象。
2、getAccount是個抽象方法,理論上也無法調用。
我們仔細觀察控制台輸出的bean1和bean2對象,我們會發現這兩個對象是通過CGLib産生的代理對象
com.dk.de[email protected]799d4f69
com.dk.de[email protected]799d4f69
是以Lookup-method的主要作用是:
1、通知spring目前類需要産生代理對象。
2、通知spring目前lookup-method标注的方法的傳回值應該是bean屬性指定的bean對象。
這樣我們就會發現,我們可以通過一個抽象方法為一個抽象類中注入我們希望的bean對象。