Java Spring:对象不是声明类的实例
我写了一个简单的Spring应用程序 使用xml格式的配置: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
<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>