java注解能继承吗?可以的

注解继承

在 Java 中,注解(Annotation)默认是不具有继承性的,这意味着如果一个类或接口上使用了某个注解,其子类或实现类不会自动继承该注解。子类或实现类需要显式地重新声明该注解,如果希望它们也具有相同的注解效果。

例子:

java 复制代码
@MyAnnotation
public class ParentClass {
    // ...
}
java 复制代码
public class ChildClass extends ParentClass {
    // 子类不继承父类上的 @MyAnnotation 注解
}

在上面的示例中,ChildClass 并不继承 ParentClass 上的 @MyAnnotation 注解。如果希望 ChildClass 也具有相同的注解效果,需要在 ChildClass 上重新声明该注解:

java 复制代码
@MyAnnotation
public class ChildClass extends ParentClass {
    // 现在 ChildClass 上也具有 @MyAnnotation 注解
}

虽然 Java 注解默认不具有继承性,但可以通过自定义注解并使用元注解 @Inherited 来实现注解的继承性。使用 @Inherited 元注解的注解将会在子类上自动继承。

示例:

java 复制代码
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MyInheritedAnnotation {
    // ...
}

@MyInheritedAnnotation
public class ParentClass {
    // ...
}
java 复制代码
public class ChildClass extends ParentClass {
    // ChildClass 上会自动继承 @MyInheritedAnnotation 注解
}

需要注意的是,并不是所有的注解都支持继承性,只有在注解定义时使用 @Inherited 元注解并且应用到类或接口上时,才能使其具有继承性。

@Primary

@Primary 是 Spring Framework 中的一个注解,用于标识一个 Bean 定义为首选(Primary Bean)。当在多个候选 Bean 中存在相同类型的依赖项时,Spring 会优先选择被 @Primary 注解标记的 Bean,作为自动装配的首选项。

主要用途和作用:

解决自动装配的歧义性:当多个 Bean 类型与依赖项类型匹配时,Spring 容器会面临歧义性,无法确定应该注入哪个 Bean。使用 @Primary 注解可以明确指定某个 Bean 作为首选项,解决歧义性。

简化配置:通过将 @Primary 注解添加到某个 Bean,可以减少配置的复杂性,因为不再需要显式地指定要注入的 Bean。

示例:

java 复制代码
@Service
public class MyPrimaryService implements MyService {
    // ...
}

@Service
@Primary
public class MySecondaryService implements MyService {
    // ...
}

在上面的示例中,MyPrimaryService 和 MySecondaryService 都实现了 MyService 接口。如果有一个依赖需要注入 MyService 类型的 Bean,而且存在多个匹配的 Bean,Spring 将选择被 @Primary 注解标记的 MySecondaryService 作为首选项。

需要注意的是,@Primary 注解通常用于解决自动装配歧义,如果不需要解决歧义性问题,可以不使用该注解。当存在多个匹配的 Bean 时,Spring 可能会抛出 NoUniqueBeanDefinitionException 异常,这时可以考虑使用 @Primary 来解决。

相关推荐
Grey Zeng9 小时前
Java SE 25新增特性
java·jdk·jdk新特性·jdk25
雨白10 小时前
Java 线程通信基础:interrupt、wait 和 notifyAll 详解
android·java
架构师沉默14 小时前
设计多租户 SaaS 系统,如何做到数据隔离 & 资源配额?
java·后端·架构
Java中文社群15 小时前
重要:Java25正式发布(长期支持版)!
java·后端·面试
每天进步一点_JL16 小时前
JVM 类加载:双亲委派机制
java·后端
用户2986985301417 小时前
Java HTML 转 Word 完整指南
java·后端
渣哥17 小时前
原来公平锁和非公平锁差别这么大
java
渣哥17 小时前
99% 的人没搞懂:Semaphore 到底是干啥的?
java
J2K17 小时前
JDK都25了,你还没用过ZGC?那真得补补课了
java·jvm·后端
kfyty72518 小时前
不依赖第三方,不销毁重建,loveqq 框架如何原生实现动态线程池?
java·架构