最近在看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 的子类。 高手说下他的执行过程 谢谢!!
这是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 的子类。 高手说下他的执行过程 谢谢!!
把singleImpl代码贴出来看看。
singleImpl 就只是简单的实现single接口
public class SingleImpl implements Single { public void sing() {
// TODO Auto-generated method stub
System.out.println("this is the first singer");
}}
这是方法注入,Spring容器会拿bean="singleImpl"指定的类的方法来实现抽象类中抽象方法。Spring是使用CGLIB在字节码级别动态实现出Instrumentalist的子类,并重写getSingle方法的方式来实现这个神奇的功能的。
你这里明明指定了执行的方法,不是执行singleImpl。getSingle()
是什么呢?