Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Inherit annotations from abstract class?

Tags:

Can I somehow group a set of annotations on an abstract class, and every class that extends this class has automatically assigned these annotations?

At least the following does not work:

@Service @Scope(value = BeanDefinition.SCOPE_PROTOTYPE) class AbstractService   class PersonService extends AbstractService {     @Autowired //will not work due to missing qualifier annotation     private PersonDao dao; } 
like image 293
membersound Avatar asked Jan 28 '14 15:01

membersound


2 Answers

The answer is: no

Java annotations are not inherited unless the annotation type has the @Inherited meta-annotation on it: https://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Inherited.html.

Spring's @Component annotation does not have @Inherited on it, so you will need to put the annotation on each component class. @Service, @Controller and @Repository neither.

like image 62
Philipp Sander Avatar answered Oct 01 '22 07:10

Philipp Sander


The short answer is: with the annotations that you mentioned in your example, no.

The long answer: there is a meta-annotation called java.lang.annotation.Inherited. If an annotation itself is annotated with this annotation, then when a class is annotated with it, its subclasses are also automatically annotated with it by implication.

However, as you can see in the spring source code, the @Service and @Scope annotation are not themselves annotated with @Inherited, so the presence of @Service and @Scope on a class is not inherited by its subclasses.

Maybe this is something that can be fixed in Spring.

like image 35
Erwin Bolwidt Avatar answered Oct 01 '22 06:10

Erwin Bolwidt