获取器注入是一种特殊的方法注入,它是把一个方法声明为返回某种类型的bean,但实际要返回的bean是在配置文件里配置的,此方法可z爱设计有些可插拔功能上,接触程序依赖,我们看下具体应用:
我们首先创建一个父类
```
pubic class User{
public void showMe(){
System.out.println("i am user");
}
}
```
创建其子类并覆盖showMe方法
```
public class Teacher extends User{
public void showMe(){
System.out.println("i am teacher");
}
}
```
创建调用方法
public abstract class GetBeanTest{
public void showMe(){
this.getBean().showMe();
}
public abstract User getBean();
}
创建测试方法
public class Main{
public static void main(String[] args){
ApplicationContext bf = new ClassPathXmlApplication("test/lookup/lookupTest.xml");
GetBeanTest test = (GetBeanTest)bf.getBean("getBeanTest");
test.showMe();
}
}
到现在为止,除了配置文件外,整个测试方法就完成了,如果之前没有接触过获取器注入可能会有疑问:抽象方法还没有被实现,怎么可以直接调用呢?答案在Spring为我们提供的获取器中,我们看看配置文件的配置:
(只列出需自己手动添加的配置)
<bean id="getBeanTest" class="......GetBeanTest">
<look-method name="getBean" bean="teacher"/>
</bean>
<bean id="teacher" class="....Teacher"/>
在配置文件中,我们看到了源码解析中提到的lookup-method子元素,这个配置完成的功能是动态的将teacher所代表的bean作为getBean的返回值,运行测试方法我们将会看到控制台上的输出:i am Teacher
当我们的业务变更或在其他情况下,teacher里面的业务逻辑已经不再符合我们的业务要求,需要进行替换怎么办呢?这是我们需要增加新的逻辑类:
public class Studetn extends Usser{
public void showMe(){
System.out.println("i am student");
}
}
同时修改配置文件:
<bean id="getBeanTest" class=".....getBeanTest">
<lookup-method name="getBean" bean="student"/>
</bean>
<bean id="teacher" class="...Teacher"/>
<bean id="student" class="...Student"/>
再次运行测试类,你会发现不一样的结果:i am student