天天看點

spring應用手冊-IOC(XML配置實作)-(22)-lookup-method标簽

戴着假發的程式員 出品

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);
}
           

控制台

spring應用手冊-IOC(XML配置實作)-(22)-lookup-method标簽

通過觀察我們發現幾個問題:

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對象。