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實現類似