3.4 spring-lookup-methodサブエレメントの使用と解析

8659 ワード

1.lookup-methodの応用:
1.1サブエレメントlookup-methodはあまり一般的ではないようですが、場合によっては非常に有用な属性であり、通常は「取得器注入」と呼ばれています.
「Spring In Action」の一言を引用する. 
'取得器注入は特殊な方法注入であり、あるタイプのbeanを返すと宣言する方法であるが、実際には、返されるbeanはプロファイル内に配置されており、この方法はいくつかの挿抜可能な機能を設計し、プログラム依存を解除することができる'
1.2具体的な応用を見てみましょう.
1.2.1まず親を作成します.
1 public class Person {
2 
3     public void showMe() {
4         System.out.println("I am person ,what about you ?");
5     }
6 }

1.2.2サブクラスを作成し、そのshowMe()メソッドを上書きします.
 1 public class Theacher extends Person {
 2 
 3     /*
 4      * (non-Javadoc)
 5      * 
 6      * @see test.lookup.method.entity.Person#showMe()
 7      */
 8     @Override
 9     public void showMe() {
10         System.out.println("I am a theacher,");
11     }
12 }

1.2.3呼び出し方法の作成
1 public abstract class GetBean {
2 
3     private void showMe() {
4         this.getBean().showMe();
5     }
6 
7     public abstract Person getBean();
8 
9 }

1.2.4テストクラスの作成
 1 public class Main {
 2 
 3     public static String XML_PATH = "test\\lookup\\method\\entity\\applicationContxt.xml";
 4 
 5     public static void main(String[] args) {
 6         try {
 7             Resource resource = new ClassPathResource(XML_PATH);
 8             XmlBeanFactory beanFactory = new XmlBeanFactory(resource);
 9             GetBean bean = (GetBean) beanFactory.getBean("getBean");
10             System.out.println(bean);
11             bean.getBean().showMe();
12         }
13         catch (Exception e) {
14             e.printStackTrace();
15         }
16     }
17 }

1.2.5プロファイルは次のとおりです.
<?xml version="1.0" encoding="UTF-8"?>
<beans 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-2.5.xsd">

    <bean id="getBean" class="test.lookup.method.entity.GetBean">
        <lookup-method name="getBean" bean="teacher"/>
    </bean>

    <bean id="teacher" class="test.lookup.method.entity.Theacher">
    </bean>
    <bean id="person" class="test.lookup.method.entity.Person">
    </bean>

</beans>

 
コンフィギュレーション・ファイルでは、teacherが表すbeanをgetBeanの戻り値として動的に使用するlookup-methodサブ要素が表示されます.ビジネスが変更する必要がある場合や置き換える必要がある場合は、コンフィギュレーション・ファイルを変更するだけです.
 
<?xml version="1.0" encoding="UTF-8"?>
<beans 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-2.5.xsd">

    <bean id="getBean" class="test.lookup.method.entity.GetBean">
        <lookup-method name="getBean" bean="person"/>
    </bean>

    <bean id="teacher" class="test.lookup.method.entity.Theacher">
    </bean>
    <bean id="person" class="test.lookup.method.entity.Person">
    </bean>

</beans>

 
これで、lookup-methodの役割を初歩的に理解しました.これはSpringのソースコードを見に行きます.
 1 /**
 2      * Parse lookup-override sub-elements of the given bean element.
 3      */
 4     public void parseLookupOverrideSubElements(Element beanEle, MethodOverrides overrides) {
 5         NodeList nl = beanEle.getChildNodes();
 6         for (int i = 0; i < nl.getLength(); i++) {
 7             Node node = nl.item(i);
 8             // Spring Bean ,
 9             // <lookup-method  
10             if (isCandidateElement(node) && nodeNameEquals(node, LOOKUP_METHOD_ELEMENT)) {
11                 Element ele = (Element) node;
12                 //  
13                 String methodName = ele.getAttribute(NAME_ATTRIBUTE);
14                 //  Bean
15                 String beanRef = ele.getAttribute(BEAN_ELEMENT);
16                 LookupOverride override = new LookupOverride(methodName, beanRef);
17                 override.setSource(extractSource(ele));
18                 overrides.addOverride(override);
19             }
20         }
21     }

上のコードはよく知っていて、parseMetaElementのコードと大同小異のようです.
最大の違いは、データ格納上にLookupOverrideタイプのエンティティを用いるデータベアラを行い、AbstractBeanDefinitionのmethodOveride属性に記録することである.