【问题标题】:Inherit annotations from abstract class?从抽象类继承注释?
【发布时间】:2014-02-19 23:20:32
【问题描述】:

我能否以某种方式将一组注释分组到一个抽象类上,并且扩展该类的每个类都自动分配了这些注释?

至少以下不起作用:

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


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

【问题讨论】:

  • 我觉得PersonService还是需要注释为@Service。但是即使被覆盖,方法也会保留它们的注释。

标签: java spring dependency-injection


【解决方案1】:

答案是:没有

Java 注释不会被继承,除非注释类型上有 @Inherited 元注释:https://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Inherited.html

Spring的@Component注解does not have @Inherited on it,所以你需要把注解放在每个组件类上。 @Service、@Controller 和 @Repository 都没有。

【讨论】:

  • cmon @denov,下次再努力:)
【解决方案2】:

简短的回答是:使用您在示例中提到的注释,

长答案:有一个名为java.lang.annotation.Inherited 的元注释。如果一个注解本身是用这个注解注解的,那么当一个类被它注解时,它的子类也自动被它暗示注解。

但是,在spring源码中可以看到,@Service@Scope注解本身并没有被@Inherited注解,所以类上@Service@Scope的存在不会被继承通过它的子类。

也许这可以在 Spring 中修复。

【讨论】:

    【解决方案3】:

    我的项目中有这段代码,它工作得很好,虽然它没有被注释为服务:

    public abstract class AbstractDataAccessService {
    
        @Autowired
        protected GenericDao genericDao;
    
    
    }
    

    @Component
    public class ActorService extends AbstractDataAccessService {
    
        // you can use genericDao here
    
    }
    

    因此您不需要在抽象类上添加注释,但即使您这样做了,您仍然需要在所有子类上添加注释,因为 @Component@Service 注释不会被继承。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 2017-12-23
      • 1970-01-01
      • 2010-10-10
      • 2014-10-28
      相关资源
      最近更新 更多