错误信息:
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 6): Property or field 'instrument' cannot be found on object of type 'com.sun.proxy.$Proxy2' - maybe not public?
at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:224)
at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:94)
at org.springframework.expression.spel.ast.PropertyOrFieldReference.access$000(PropertyOrFieldReference.java:46)
at org.springframework.expression.spel.ast.PropertyOrFieldReference$AccessorLValue.getValue(PropertyOrFieldReference.java:374)
at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:88)
at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:120)
at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:242)
at org.springframework.context.expression.StandardBeanExpressionResolver.evaluate(StandardBeanExpressionResolver.java:161)
... 23 more
由于aop是默认创建的代理是基于接口的,不能访问类的方法。performer接口中只有一个perform方法,所以会报错:
Property or field 'instrument' cannot be found on object of type 'com.sun.proxy.$Proxy2' -
解决此问题,只需要在aop:config中加上proxy-target-class="true"
就行了
<aop:config proxy-target-class="true">
<aop:aspect ref="log">
<aop:pointcut id="perform" expression="execution(* algo.study.spring.xmlbean.Performer.perform(..))" />
<aop:before pointcut-ref="perform" method="start" />
<aop:after pointcut-ref="perform" method="end" />
</aop:aspect>
</aop:config>