大家好!
代码如下:package cal2;public interface PoCalculator {}
package cal2;public class PoCalculatorImpl implements PoCalculator{}
package cal2;public interface MaxCalculator {
   public double max(double a,double b);
}
package cal2;public class MaxCalculatorImpl implements MaxCalculator{
    public double max(double a,double b){
     double result = (a>=b)?a :b;
     System.out.println("max:"+result);
     return result;
    }
}
package cal2;public interface MinCalculator {
   public double min(double a, double b);
}package cal2;public class MinCalculatorImpl implements MinCalculator{
    public double min(double a,double b){
     double result = (a <= b)? a: b;
     System.out.println("min:"+result);
     return result;
    }
}
package cal2;import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.DeclareParents;@Aspect
public class CalculatorIntroduction {
   @DeclareParents(value="cal2.PoCalculatorImpl",defaultImpl=MaxCalculatorImpl.class)
   public MaxCalculator maxCalculator;
   @DeclareParents(value="cal2.PoCalculatorImpl",defaultImpl=MinCalculatorImpl.class)
   public MinCalculator minCalculator;
}
package cal2;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main2 {
   public static void main(String [] args){
   ApplicationContext con = new ClassPathXmlApplicationContext("applicationContext.xml");
   PoCalculator po = (PoCalculator) con.getBean("poCalculator");
   MaxCalculator m1 = (MaxCalculator) po;
   m1.max(1, 2);
   MinCalculator m2 = (MinCalculator) po;
   m2.min(1, 3);
   }
}上面的代码是可以正确运行的。原意是打算通过Bean引入行为使得一个类拥有其他多个类的功能。
可是我有点不明白的是:
1)在Main2类中,po/m1/m2都是实体对象,为什么能够实例化接口呢?我在Java的多态里面见过实例化接口,但是这里似乎没有多态性的呀。
2)我将Main2类里面的接口都换为了Impl的实现类了,
比如PoCalculatorImpl po = (PoCalculatorImpl)con.getBean("PoCalculator");
可是却编译失败,提示无法转换,我就很奇怪,原先宣传@DeclareParent的不就是XXXImpl几个实现类么?为什么写成接口就可以,写成Impl就不行?
希望大家帮忙解答一下,谢谢了呀!
我刚刚开始学习Spring几天,有些东西也是认知很有限,请见谅!JavaSpring

解决方案 »

  1.   

    1》谁说接口不能实例化,List就是接口。好好看看什么叫多态性。2》spring是通过反射机制注入的,默认应该是jdk的反射机制,jdk反射是面向接口的。所有报错,或者加入cglib,这个jar是面向普通类的。
      

  2.   

    1.所谓实例化接口的问题,楼主上网找找动态代理就明白了。
    2.基于1中的理论。楼主有点说错了,编译可以通过,运行出错了。原因是没有引入spring中的core包或者没有导入cglib包。
      

  3.   

    您好!谢谢您的回答呀!
    我还有一个问题,希望您可以帮忙看看:
    我在学Spring的书里有以下的章节,因为有点多,我不知道哪些是比较需要学习的(我快要实习了,时间比较赶,所以只能先学习比较重要且基础的)
    Spring简介
    高级Spring IoC容器
    Spring AOP和AspectJ支持
    Spring的脚本 (Groovy,BeanShell,JRuby)
    Spring Security
    将Spring与其他Web框架集成
    Spring Web Flow
    Spring @MVC
    Spring REST
    Spring和Flex
    Grails
    Spring Roo
    Spring测试
    Spring Portlet MVC框架
    数据访问
    Spring中的事物管理
    EJB.Spring Remoting和Web服务
    企业中的Spring
    消息
    Spring Integration
    spring Batch
    分布式的Spring
    Spring 和jBPM
    OSGi 和Spring希望您可以帮帮忙看看,谢谢了!