1

首先我尝试xml配置:

 <aop:aspect>
        <aop:declare-parents types-matching="DBOperations.ILearningData+" 
                             implement-interface="DBOperations.ISaveResults"
                             delegate-ref="saverExtension"/>
 </aop:aspect>

而且效果很好。

现在我尝试制作aspectj,它应该做同样的事情:

public aspect ASaveResults {

public ASaveResults() { }

declare parents : TSaveResults implements ILearningData;
}

其中 TSaveResults 与 bean“saverExtension”相同。

我运行我的代码:

    ...
@Value("#{learningData}")
protected ILearningData saver;
    ...
    ((ISaveResults)saver).saveResults();

并得到错误:

线程“AWT-EventQueue-0”中的异常 java.lang.ClassCastException:sun.proxy.$Proxy12 无法转换为 DBOperations.ISaveResults

我的aspectj有什么问题?

我也尝试了这段代码,但没有成功:

public aspect ASaveResults {

    public ASaveResults() { }
    
    declare parents : ISaveResults implements ILearningData;
    
    public void saveResults() {
        System.out.println("saver aspect");
    }

}
4

2 回答 2

2

你在那里使用的是核心 aspectj,所以如果你想使用 Spring AOP,而不是 xml 配置,那么这就是你应该做的(未经测试):

@Aspect
public class ASaveResults {

   @DeclareParents(value="ISaveResults")
   public static ILearningData interf;

   public void saveResults() {
      System.out.println("saver aspect");
   }
}
于 2013-06-04T19:30:26.353 回答
1
public aspect ASaveResults {    

public ASaveResults() { }

declare parents : LearningData extends TSaveResults;

}

其中 LearningData 和 TSaveResults - 类。所以现在 TSaveResults 扩展了 LearningData - 这是我的目标

于 2013-06-04T19:39:03.827 回答