文件构造
这个示例一共须要新建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相似)