Spring表达式语言不能与spring aop一起使用

时间:2010-08-28 16:42:57

标签: spring spring-aop

<bean id="eddie" class="com.springinaction.Instrumentalist">
    <property name="instrument" value="#{violin}"></property>
    <property name="song" value="#{kenny.song}"></property>

</bean>

<bean id="violin" class="com.springinaction.Violin">
</bean>


<bean id="kenny" class="com.springinaction.Instrumentalist">
    <property name="song" value="Kenny is a star,kenny is a star"></property>
    <property name="instrument" ref="saxopone"></property>
</bean>

<aop:config>

    <aop:aspect ref="audience">

        <aop:before pointcut="execution(* com.springinaction.Performer.perform(..))" method="takeSeats()"/>

        <aop:after-throwing method="demandRefund" pointcut="execution(* com.springinaction.Performer.perform(..))"/>

    </aop:aspect>

</aop:config>

在上面的代码中,我使用spring表达式语言注入song bean的instrumenteddie属性。但是,song属性未正确注入..我得到以下错误:

  

线程“main”中的异常   org.springframework.beans.factory.BeanCreationException:   创建名为'eddie'的bean时出错   在类路径资源中定义   [spring-config.xml]:初始化   豆子失败了;嵌套异常是   org.springframework.beans.factory.BeanExpressionException:   表达式解析失败;嵌套   例外是   org.springframework.expression.spel.SpelEvaluationException:   EL1008E :(位置6):场地或财产   '歌'无法在对象上找到   在'$ Proxy4'输入   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)     在   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)     在   org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:290)     在   org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)     在   org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)     在   org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)     在   org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:557)     在   org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:842)     在   org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:416)     在   org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:139)     在   org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:83)     在   com.springinaction.Main.main(Main.java:10)

在没有注入歌曲属性的地方正确地注入了乐器属性,并且这种情况只是因为aop而发生..

当我评论<aop:config>时它工作正常..

有什么不对吗?

1 个答案:

答案 0 :(得分:4)

你试过吗

<aop:config proxy-target-class="true">
...
</aop:config>

通过这种方式,您将获得一个动态子类,并且该属性应该在通过Spring AOP创建的代理中可用。

Spring AOP的默认行为是为接口创建Java代理,因此无法通过代理访问任何类的属性。