Java Spring:对象不是声明类的实例

Java Spring:对象不是声明类的实例,java,spring,aop,spring-aop,Java,Spring,Aop,Spring Aop,我写了一个简单的Spring应用程序 使用xml格式的配置: <bean id="flyingDelegate" class="pl.marcindebski.spring.aspects.LowFlyingKnight"></bean> <aop:config> <aop:aspect ref="usageTracking"> <aop:declare-parents types-m

我写了一个简单的Spring应用程序 使用xml格式的配置:

  <bean id="flyingDelegate" class="pl.marcindebski.spring.aspects.LowFlyingKnight"></bean>

  <aop:config>
    <aop:aspect ref="usageTracking">
        <aop:declare-parents
            types-matching="pl.marcindebski.spring.aspects.Knight+"
            implement-interface="pl.marcindebski.spring.aspects.FlyingKnight"
            delegate-ref="flyingDelegate"
            />
    </aop:aspect>
  </aop:config>
在带有
flyingKnight.fly()的行上我得到:

Exception in thread "main" org.springframework.aop.AopInvocationException: AOP configuration seems to be invalid: tried calling method [public abstract void pl.marcindebski.spring.aspects.FlyingKnight.fly()] on target [pl.marcindebski.spring.aspects.BraveKnight@5e82df6a]; nested exception is java.lang.IllegalArgumentException: object is not an instance of declaring class
问题:

1) 类
LowFlyingKnight
实现了
FlyingKnight
接口中的
fly()
方法。为什么Spring考虑<代码>骑士>代码> <代码> FrutyWalth(<代码> KalnType的FrunWordNo.<代码>)是真的,但是调用“<代码>蝇())< /代码>方法失败。

2) 类BraveKnight是Knight接口的一个实现,那么为什么
Knight instanceof BraveKnight
为false,而
Knight.EnboundonQuest
从BraveKnight执行实现呢


主类->App.java

package pl.marcindebski.spring.aspects;

import org.springframework.context.support.FileSystemXmlApplicationContext;

public class App {

    public static void main(String[] args) throws Exception {
        FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext(
                new String[] {
                        "E:/dev/eclipse-workspaces/1-aspects/flying.xml",
                        "E:/dev/eclipse-workspaces/1-aspects/minstrel.xml" });

        Knight braveKnight = context.getBean(Knight.class);
        if (braveKnight instanceof BraveKnight) { // FALSE!
            braveKnight.embarkOnQuest();
        }

        braveKnight.embarkOnQuest(); // Working!

        if (braveKnight instanceof FlyingKnight) // true
        {
            FlyingKnight flyingKnight = (FlyingKnight) braveKnight;
            flyingKnight.fly();// why its not working ?
        }

        context.close();
    }

}
方面:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xsi:schemaLocation="http://www.springframework.org/schema/aop 
      http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans.xsd">


  <bean id="flyingDelegate" class="pl.marcindebski.spring.aspects.LowFlyingKnight"></bean>

  <aop:config>
    <aop:aspect>
        <aop:declare-parents
            types-matching="pl.marcindebski.spring.aspects.Knight+"
            implement-interface="pl.marcindebski.spring.aspects.FlyingKnight"
            delegate-ref="flyingDelegate"
            />
    </aop:aspect>
  </aop:config>

</beans>

bean定义:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xsi:schemaLocation="http://www.springframework.org/schema/aop 
      http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="knight" class="pl.marcindebski.spring.aspects.BraveKnight">
    <constructor-arg ref="quest" />
  </bean>

  <bean id="quest" class="pl.marcindebski.spring.aspects.SlayDragonQuest">
    <constructor-arg value="#{T(System).out}" />
  </bean>

  <bean id="minstrel" class="pl.marcindebski.spring.aspects.Minstrel">
    <constructor-arg value="#{T(System).out}" />
  </bean>

  <aop:config>
    <aop:aspect ref="minstrel">
      <aop:pointcut id="embark"
          expression="execution(* *.embarkOnQuest(..))"/>

      <aop:before pointcut-ref="embark" 
          method="singBeforeQuest"/>

      <aop:after pointcut-ref="embark" 
          method="singAfterQuest"/>
    </aop:aspect>
  </aop:config>

</beans>


BraveKnight是如何融入这一切的?BraveKnight是一个bean,Knight接口的实现:Hmmm。异常显示它正在告诉BraveKnight飞行。我不知道为什么勇敢骑士被认为是飞行骑士。您可能完全获取了错误的Knight?BraveKnight是Knight的一个实现(来自java代码),它添加了接口FlyingKnight(作为Spring的介绍)。您能展示一下其他bean是如何定义的吗
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xsi:schemaLocation="http://www.springframework.org/schema/aop 
      http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="knight" class="pl.marcindebski.spring.aspects.BraveKnight">
    <constructor-arg ref="quest" />
  </bean>

  <bean id="quest" class="pl.marcindebski.spring.aspects.SlayDragonQuest">
    <constructor-arg value="#{T(System).out}" />
  </bean>

  <bean id="minstrel" class="pl.marcindebski.spring.aspects.Minstrel">
    <constructor-arg value="#{T(System).out}" />
  </bean>

  <aop:config>
    <aop:aspect ref="minstrel">
      <aop:pointcut id="embark"
          expression="execution(* *.embarkOnQuest(..))"/>

      <aop:before pointcut-ref="embark" 
          method="singBeforeQuest"/>

      <aop:after pointcut-ref="embark" 
          method="singAfterQuest"/>
    </aop:aspect>
  </aop:config>

</beans>