为什么使用@target定义切入点不起作用?

时间:2012-11-16 12:12:48

标签: spring annotations spring-annotations aspects

我正在尝试使用Spring方面来保存附加数据,同时使用MongoRepository存储文档。目标是这个界面:

@InSearch
public interface ItemRepository extends MongoRepository<Item, Long>, 
    ItemRepositoryCustom 
{
    List<Item> findAllByUsername( String username );
    List<Item> findAllBySessionId( Long sessionId );
}

当我使用此切入点时:

@Pointcut( "execution(* save(..)) && " + 
    "target(org.springframework.data.mongodb.repository.MongoRepository)" )
private void saveEntity()
{}

此方法在调用open方法之前运行正常:

@Before( "saveEntity() && args(entity)" )
public void beforeSavingEntity( JoinPoint jp, AuditedBean entity )
{ ... }

但是我希望它仅使用带有@InSearch注释的接口运行,所以我尝试用这种方式定义切入点:

@Pointcut( "execution(* save(..)) && " +
    "target(org.springframework.data.mongodb.repository.MongoRepository) && " +
    "@target(xx.annotations.InSearch)" )
private void saveEntity()
{}

注释定义:

@Target( { ElementType.TYPE} )
@Retention(RetentionPolicy.RUNTIME)
public @interface InSearch
{}

通过此切入点,不会调用方法beforeSavingEntity。我在日志上没有任何错误。我不确定我是否理解有关@target的文档及其与@within的区别。我也试过@within并且也没有用。

如何定义此切入点以在实现扩展save并使用MongoRepository注释的接口的类中选择@InSearch方法执行?

谢谢!

1 个答案:

答案 0 :(得分:1)

我认为您在应用程序中使用了基于类的代理。

由于Java中的实现类没有继承注释,请尝试将@InSearch放在实现类上。

请参阅Where should I put @Transactional annotation: at an interface definition or at an implementing class?