2016-03-17 2 views
0

У меня есть этот интерфейс:Spring аспект вызов на аннотациях по методу интерфейса

public interface FakeTemplate { 

    @CustomAnnotation 
    void foo() { 

    } 

} 

И это реализация интерфейса:

@Component 
public FakeImpl implements FakeTemplate { 

    @Override 
    public void foo() { 
     //Do Stuff 
    } 

} 

И этот аспект:

@Aspect 
@Component 
public class CustomAspect { 

    @Before(value = "@annotation(com.fake.CustomAnnotation)") 
    public void doStuffBefore(JoinPoint joinPoint} { 

    } 

} 

I используя пружину с включенным AspectJ, используя: @EnableAspectJAutoProxy(proxyTargetClass = true)

Моя проблема заключается в том, что метод doStuffBefore не вызывается перед выполнением метода foo() FakeImpl. Это работает, когда я положил @CustomAnnotation на FakeImpl вместо FakeTemplate, но я бы предпочел поместить аннотацию на FakeTemplate, поскольку он находится в отдельном пакете API, и я как бы делегировал его как место, где я помещал все свои аннотации ,

Я также хотел бы гарантировать, что CustomAnnotation вызывается для каждого класса, который реализует FakeTemplate, не забывая помещать аннотацию на все классы реализации.

Есть ли способ получить консультацию, если аннотация предназначена только для класса интерфейса?

+0

дубликата этого: http://stackoverflow.com/questions/2847640/spring-aop-pointcut-that-matches-annotation-on-interface –

+0

Не очень , @RahulSharma, это определенно похоже, но я не хочу указывать интерфейс в этом аспекте. Я хочу, чтобы иметь возможность бросить аннотацию на любом интерфейсе и иметь все реализующие классы любого интерфейса, на котором находится аннотация, имеют этот совет. Я не хочу постоянно добавлять спецификации интерфейса в этот аспект. – philhan

ответ

2

Наследование аннотаций не работает для методов в java. Но вы можете использовать другое выражение с пересечениями, что-то вроде execution(public * FakeTemplate+.foo(..))

+0

Да, это то, чего я пытался избежать. Я хотел бы использовать аннотацию на нескольких интерфейсах, поэтому мне придется постоянно добавлять новые интерфейсы в аспект. Я просто добавлю аннотацию к реализующим классам, что упрощает мой аспект и, хотя его повторная работа, имеет для меня наибольший смысл. Отметьте свой ответ как правильный. – philhan

Смежные вопросы