1、用法(获取器注入) ,方便后期替换实现
eg:
抽象类
public abstract class Car {
public abstract void show();
}
一个实现
public class Audi extends Car {
@Override
public void show() {
System.out.println("Audi");
}
}
public abstract class LookupMethodDemo {
//用于lookup-method注入
public abstract Car getCar();
public void test(){
getCar().show();
}
}
配置:
<bean id="lookupDemo" class="test.mttest.LookupMethodDemo">
<lookup-method name="getCar" bean="audi"/>
</bean>
<bean id="audi" class="test.mttest.Audi"/>
2、测试代码:
@Test
public void testCircleDep() {
BeanFactory factory = new XmlBeanFactory(new ClassPathResource(PATH + MycontextA));
LookupMethodDemo demo = (LookupMethodDemo)factory.getBean("lookupDemo");
demo.test();
}
3、大致实现原理(动态代理的应用)
(1)、SimpleInstantiationStrategy.java这边会判断有没有配置lookup-method或者replace-method,如果有就会用cglib生成子类 进行代理处理
(2、CglibSubclassingInstantiationStrategy.java生成子类并实例化代理实例
(3)
4、
用cglib生成子类,同时设置
MethodOverrideCallbackFilter过滤器以及CALLBACK_TYPES拦截器
其中MethodOverrideCallbackFilter作用就是:设置哪些方法需要拦截lookup-method,replace-method分别用LookupOverrideMethodInterceptor.class, ReplaceOverrideMethodInterceptor.class拦截器,剩下的方法不用拦截
5、
当生成的代理对象调用show方法时,里面调用getCar方法这个方法就是被拦截到这里,在这里面去如果配置了名称直接用name获取对应bean,如果没有配置名称则用返回值类型从容器里面获取对应类型的bean,replace-method实现类似