我正在尝试围绕扩展接口的方法提出建议:
public interface StructureService {
void delete(FileEntry entry);
}
public interface FileService extends StructureService {
void dummy();
}
实现这些的类如下所示:
public class DbStructureService implements StructureService {
public void delete(FileEntry entry) {
}
}
public class DbFileService extends DbStructureService implements FileService {
public void dummy() {
}
}
我正在尝试匹配delete方法,但仅适用于实现FileService的类。
我定义了以下方面:
public aspect FileServiceEventDispatcherAspect {
pointcut isFileService() : within(org.service.FileService+);
pointcut delete(FileEntry entry) :
execution(void org.service.StructureService.delete(..))
&& args(entry) && isFileService();
void around(FileEntry entry) : delete(entry) {
proceed(entry);
}
}
问题是只要我启用了isFileService切入点,就不会匹配任何类;即使有很多方法可以匹配这个
如果我将within(org.service.FileService+)
替换为within(org.service.StructureService+)
,它也可以正常工作。
我尝试过尝试过这个()等但没有成功。我如何在aspectj中执行此操作?
编辑: 更新了实现接口的类的外观。我认为这种情况可能很难建议,因为DbFileService
中没有重写方法答案 0 :(得分:1)
我想你的意思是DbFileService实现FileService而不是StructureService。鉴于此,此代码应该有效:
public aspect FileServiceEventDispatcherAspect {
pointcut delete(FileService this_, FileEntry entry) :
execution(void org.service.StructureService.delete(..))
&& args(entry) && this(this_);
void around(FileService this_, FileEntry entry) : delete(this_, entry) {
proceed(this_, entry);
}
}
“内部”切入点不适用于此处,因为它是“基于词汇结构的切入点”("AspectJ in Action", second edition.)