乐趣区

关于method:lookupmethod标签实践与分析

文件构造
这个示例一共须要新建 6 个文件

创立实体类
有 4 个实体类(一个父类 + 两个子类 + 一个操作类)
Animal.java(父类)

package com.aqin.custom.MethodOverride.lookup;

/**

  • @Description

    • @Author aqin1012 AQin.
  • @Date 2022/8/22 9:28 AM
  • @Version 1.0
    */
    public class Animal {
    public Animal () {
    System.out.println (“ 吃点啥嘞?”) ;
    }
    }
    复制代码
    Cat.java

package com.aqin.custom.MethodOverride.lookup;

/**

  • @Description

    • @Author aqin1012 AQin.
  • @Date 2022/8/22 10:01 AM
  • @Version 1.0
    */
    public class Cat extends Animal {
    public Cat () {
    System.out.println (“ 吃 (_ _).。oO……猫粮 ” ) ;
    }
    }
    复制代码
    Dog.java

package com.aqin.custom.MethodOverride.lookup;

/**

  • @Description

    • @Author aqin1012 AQin.
  • @Date 2022/8/22 9:29 AM
  • @Version 1.0
    */
    public class Dog extends Animal {
    public Dog () {
    System.out.println (“ 吃 (*≧ω≦)……狗粮 ” ) ;
    }
    }
    复制代码
    AnimalAction.java

package com.aqin.custom.MethodOverride.lookup;

/**

  • @Description

    • @Author aqin1012 AQin.
  • @Date 2022/8/22 10:25 AM
  • @Version 1.0
    */
    public abstract class AnimalAction {
    /**
  • 获取执行该动作的动物
    *
  • @return
    */
    public abstract Animal getAnimal () ;
    }
    复制代码
    创立配置文件

新建 Spring 配置文件

增加如下 bean 定义:
< bean id=”dog” class=”com.aqin.custom.MethodOverride.lookup.Dog” ></ bean >
< bean id=”cat” class=”com.aqin.custom.MethodOverride.lookup.Cat” ></ bean >

< bean id=”animalAction_A” class=”com.aqin.custom.MethodOverride.lookup.AnimalAction” >
< lookup-method name=”getAnimal” bean=”dog” ></ lookup-method >
</ bean >

< bean id=”animalAction_B” class=”com.aqin.custom.MethodOverride.lookup.AnimalAction” >
< lookup-method name=”getAnimal” bean=”cat” ></ lookup-method >
</ bean >
复制代码
创立测试类

package com.aqin.custom.MethodOverride.test;

import com.aqin.custom.MethodOverride.lookup.AnimalAction;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**

  • @Description

    • @Author aqin1012 AQin.
  • @Date 2022/8/22 10:29 AM
  • @Version 1.0
    */
    public class TestMethodOverride {
    public static void main (String [] args ) {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext (“MethodOverride.xml”) ;
    AnimalAction animalActionA = (AnimalAction) applicationContext.getBean (“animalAction_A”) ;
    animalActionA.getAnimal () ;
    AnimalAction animalActionB = (AnimalAction) applicationContext.getBean (“animalAction_B”) ;
    animalActionB.getAnimal () ;
    }
    }
    复制代码
    测试后果

测试剖析
先在下图地位打个断点

抉择 debug 形式执行

一直下一步,直到咱们在配置类中配置的 4 个 Bean 都能在 this 对象中的 singletonObjects 中找到的时候,咱们来查看应用了 lookup-method 标签的那两个 Bean,能够看到这两个对象都是 cglib 的代理对象

当调用到 getAnimal()办法时,会跳转到 CglibSubclassingInstantiationStrategy 中的 intercept()办法中

这里的 lo 是 animalAction_A,能够看到 lo 中的 beanName 跟 xml 配置文件中 animalAction_A 的 < lookup-method name=”getAnimal” bean=”dog” ></ lookup-method > 标签中的 bean=”dog” 是绝对应的(animalAction_B 相似)

退出移动版