2014-01-28 3 views
9

Могу ли я каким-то образом группировать набор аннотаций на абстрактный класс, и каждый класс, который расширяет этот класс, автоматически присваивал эти аннотации?Наследовать аннотации из абстрактного класса?

По крайней мере, следующее не работает:

@Service 
@Scope(value = BeanDefinition.SCOPE_PROTOTYPE) 
class AbstractService 


class PersonService extends AbstractService { 
    @Autowired //will not work due to missing qualifier annotation 
    private PersonDao dao; 
} 
+1

Я думаю, что 'PersonService' по-прежнему нужно аннотировать как' @ Service'. Но методы сохраняют свою аннотацию даже тогда, когда ее переоценивают. –

ответ

14

Ответ: нет

Java аннотаций не не наследуется, если тип аннотации не имеет @Inherited мета-аннотацию на нем: https://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Inherited.html.

Весна @Component аннотация does not have @Inherited on it, поэтому вам нужно будет поместить аннотацию на каждый класс компонентов. @Service, @Controller и @Repository.

+0

ссылка на документы мертва – denov

+0

спасибо. Я починил это. вы могли бы это сделать ;-) –

+0

cmon @denov, приложите некоторое усилие в следующий раз :) –

1

У меня есть этот кусок кода в моем проекте, и она работает просто отлично, хотя это не аннотированный в качестве службы:

public abstract class AbstractDataAccessService { 

    @Autowired 
    protected GenericDao genericDao; 


} 

и

@Component 
public class ActorService extends AbstractDataAccessService { 

    // you can use genericDao here 

} 

Таким образом, вам не нужно размещать аннотации в своем абстрактном классе, но даже если вы это сделаете, больным приходится ставить аннотацию по всему подклассу как @Component или @Service аннотации не наследуются.

5

Короткий ответ: с аннотациями, которые вы упомянули в своем примере, no.

Длинный ответ: есть мета-аннотация, называемая java.lang.annotation.Inherited. Если аннотацию аннотируют с помощью этой аннотации, тогда, когда класс аннотируется с ней, ее подклассы также автоматически аннотируются с помощью импликации.

Однако, как вы можете увидеть в исходной пружинной коде @Service и @Scope аннотации не сами с аннотацией @Inherited, поэтому наличие @Service и @Scope на классе не наследуются его подклассами.

Возможно, это что-то, что можно установить весной.

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