最近在看spring in action 发现里面获取器注入有个疑惑!
这是Instrumentalist 抽象类public abstract class Instrumentalist implements Performer { public void perform() {
// TODO Auto-generated method stub
 getSingle().sing();
}
public abstract Single getSingle(); //得到single类型  single是接口}
下面是spring配置里的代码<bean id="instrumentalist" class="com.jdx.springzero.methoddi.Instrumentalist">
<lookup-method name="getSingle" bean="singleImpl"/>
</bean>singleImpl是single接口的具体实现。下面是我的测试  public static void main(String[] args){
  ApplicationContext ac=new ClassPathXmlApplicationContext("context/springidol*.xml");
    Instrumentalist t=(Instrumentalist) ac.getBean("instrumentalist");
        t.perform();
 
  }上面运行后很正常  会调用到singleImpl的sing()方法但现在要问就在   Instrumentalist t=(Instrumentalist) ac.getBean("instrumentalist");
这句里面,它怎么可以实例化一个抽象类呢?
我也没有Instrumentalist 的子类。 高手说下他的执行过程  谢谢!!

解决方案 »

  1.   


    把singleImpl代码贴出来看看。
      

  2.   


    singleImpl 就只是简单的实现single接口 
    public class SingleImpl implements Single { public void sing() {
    // TODO Auto-generated method stub
            System.out.println("this is the first singer");
    }}
      

  3.   

    <lookup-method name="getSingle" bean="singleImpl"/>
    这是方法注入,Spring容器会拿bean="singleImpl"指定的类的方法来实现抽象类中抽象方法。Spring是使用CGLIB在字节码级别动态实现出Instrumentalist的子类,并重写getSingle方法的方式来实现这个神奇的功能的。
      

  4.   

    <lookup-method name="getSingle" bean="singleImpl"/>
    你这里明明指定了执行的方法,不是执行singleImpl。getSingle()
    是什么呢?
      

  5.   

    spring 通过CGLIB重写原方法并返回实例