lookup-method标签实践与分析

2年前 (2022) 程序员胖胖胖虎阿
255 0 0

文件结构
这个示例一共需要新建6个文件

lookup-method标签实践与分析

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

lookup-method标签实践与分析

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

lookup-method标签实践与分析

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

lookup-method标签实践与分析

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

lookup-method标签实践与分析

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 () ;
    }
    复制代码
    创建配置文件

lookup-method标签实践与分析

新建Spring配置文件

lookup-method标签实践与分析

添加如下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 >
复制代码
创建测试类

lookup-method标签实践与分析

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 () ;
    }
    }
    复制代码
    测试结果

lookup-method标签实践与分析

测试分析
先在下图位置打个断点

lookup-method标签实践与分析

选择debug方式执行

lookup-method标签实践与分析

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

lookup-method标签实践与分析

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

lookup-method标签实践与分析

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

lookup-method标签实践与分析

版权声明:程序员胖胖胖虎阿 发表于 2022年11月22日 上午1:24。
转载请注明:lookup-method标签实践与分析 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...