3.5 spring-replaced-methodサブ要素の使用と解析
7588 ワード
1.replaced-methodサブエレメント
メソッド置換:実行時に既存のメソッドを新しいメソッドで置換できます.以前のlook-upとは異なり、replace-methodは戻ってきたエンティティbeanを動的に置換するだけでなく、既存のメソッドの論理を動的に変更することができます.
1.1.1使用例:
まずBeanを作成してビジネスを完了します
運用期間が経過すると、既存の論理を変更する必要があります.
XMLは以下の通り
テストクラス
テストを実行すると、予想された結果が表示され、コンソールが正常に印刷されました.
この子元素の使い方を知って、Springがどのようにこの元素を抽出したのかを見てみましょう.
BeanDefinitionParserDelegate.java
lookup-methodもreplace-methodもmethodOverrideを構築し、AbstractBeanDefinitionのmethodOerrides属性に最終的に記録することがわかる.
この属性をどのように使うかは、後で検討し続けます.
メソッド置換:実行時に既存のメソッドを新しいメソッドで置換できます.以前のlook-upとは異なり、replace-methodは戻ってきたエンティティbeanを動的に置換するだけでなく、既存のメソッドの論理を動的に変更することができます.
1.1.1使用例:
まずBeanを作成してビジネスを完了します
1 public class Person {
2
3 public void show() {
4 System.out.println("I am Person ..");
5 }
6 }
運用期間が経過すると、既存の論理を変更する必要があります.
1 import java.lang.reflect.Method;
2
3 import org.springframework.beans.factory.support.MethodReplacer;
4
5 public class ReplacedClass implements MethodReplacer {
6
7 @Override
8 public Object reimplement(Object obj, Method method, Object[] args) throws Throwable {
9 System.out.println(obj);
10 System.out.println(method.getName());
11 System.out.println("I am replacer...");
12 return null;
13 }
14
15 }
XMLは以下の通り
<?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="person" class="test.replaced.Person">
<replaced-method name="show" replacer="replace"></replaced-method>
</bean>
<bean id="replace" class="test.replaced.ReplacedClass">
</bean>
</beans>
テストクラス
1 public class Main {
2
3 public static String XML_PATH = "test\\replaced\\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 Person bean = (Person) beanFactory.getBean("person");
10 System.out.println(bean);
11 bean.show();
12 }
13 catch (Exception e) {
14 e.printStackTrace();
15 }
16 }
17 }
テストを実行すると、予想された結果が表示され、コンソールが正常に印刷されました.
test.replaced.Person$$EnhancerBySpringCGLIB$$7f7813f2@1a69b07
test.replaced.Person$$EnhancerBySpringCGLIB$$7f7813f2@1a69b07
show
I am replacer...
この子元素の使い方を知って、Springがどのようにこの元素を抽出したのかを見てみましょう.
BeanDefinitionParserDelegate.java
1 /**
2 * Parse replaced-method sub-elements of the given bean element.
3 */
4 public void parseReplacedMethodSubElements(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, REPLACED_METHOD_ELEMENT)) {
11 Element replacedMethodEle = (Element) node;
12 //
13 String name = replacedMethodEle.getAttribute(NAME_ATTRIBUTE);
14 //
15 String callback = replacedMethodEle.getAttribute(REPLACER_ATTRIBUTE);
16 ReplaceOverride replaceOverride = new ReplaceOverride(name, callback);
17 // Look for arg-type match elements.
18 List<Element> argTypeEles = DomUtils.getChildElementsByTagName(
19 replacedMethodEle, ARG_TYPE_ELEMENT);
20 for (Element argTypeEle : argTypeEles) {
21 String match = argTypeEle.getAttribute(ARG_TYPE_MATCH_ATTRIBUTE);
22 //
23 match = (StringUtils.hasText(match) ? match
24 : DomUtils.getTextValue(argTypeEle));
25 if (StringUtils.hasText(match)) {
26 replaceOverride.addTypeIdentifier(match);
27 }
28 }
29 replaceOverride.setSource(extractSource(replacedMethodEle));
30 overrides.addOverride(replaceOverride);
31 }
32 }
33 }
lookup-methodもreplace-methodもmethodOverrideを構築し、AbstractBeanDefinitionのmethodOerrides属性に最終的に記録することがわかる.
この属性をどのように使うかは、後で検討し続けます.