Spring API上说Introduction 就是<aop:declare-parents ..>这个
相当于是给被切入的类实现了一个指定的接口
这么说下面这样一个代码
interface A {} //切面接口
class B implements A {} //切面
class C {} //被切面
<bean id="c" class="C"/>
<aop:declare-parents
   types-matching="C+"
   implement-interface="A"
   default-impl="B"/>配置完成之后通过BeanFactory.getBean("c") 
得到的应该可以是一个实现了A接口的C
那么这个东西既可以被强转成C也可以被强转成A(getBean得到的是Object)
但是我C c = (C)factory.getBean("c")报错 说无法强转
A a = (A)factory.getBean("c")就没问题
用factory.getBean("c").getClass().getDeclaredMethods()打印出来 发现只有一个方法(实际我在类B和类C中都有定义一个测试方法)
也就是说实际相当于一顿操作之后 我的bean c被弄成了A类型的?
实际代码贴在楼下了  想很久了没懂 帮忙看看  感激万分

解决方案 »

  1.   

    Contestant.javapackage com.jordan.spring;public interface Contestant {
    public void sayHello();
    }Singer.javapackage com.jordan.spring;public class Singer implements Contestant { @Override
    public void sayHello() {
    System.out.println("-------------------Singer.sayHello()--------------------------");
    }}Performer.javapackage com.jordan.spring;public class Performer {
    public void perform() {
    System.out.println("-------------------Performer.perform()-----------------------");
    }
    }
    ApplicationContext.xml <bean name="performer" class="com.jordan.spring.Performer"/>
    <aop:config>

      <aop:aspect>
      <aop:declare-parents
      types-matching="com.jordan.spring.Performer+"
      implement-interface="com.jordan.spring.Contestant"
      default-impl="com.jordan.spring.Singer"/>
      </aop:aspect>
     
    </aop:config>
    Client.javapackage com.jordan.spring;import org.springframework.beans.factory.BeanFactory;
    import org.springframework.context.support.ClassPathXmlApplicationContext;public class Client {
    public static void main(String[] args) {
    BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
    // Performer performer = (Performer)factory.getBean("performer"); //报错
    // Contestant contestant = (Contestant)factory.getBean("performer");//不报错
    // contestant.sayHello();

    Object temp = factory.getBean("performer");
    System.out.println(temp.getClass().getDeclaredMethods());
    }
    }
      

  2.   

    spring Aop is support with interface,or use cglib.声明Performer为接口,这可就可以使用反射代理,或者使用cglib的类加强,这里的aop为目标对象添加接口方法,你需要指定aop使用的mode策略.按你以上的测试,只需要为Performer抽象为接口就可以解决问题了