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 来解决。

相关推荐
Highcharts.js12 分钟前
缺失数据可视化图表开发实战|Highcharts创建人员出生统计面积图表示例
开发语言·前端·javascript·信息可视化·highcharts·图表开发
测试员周周5 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
Mahir087 小时前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
杜子不疼.7 小时前
【C++ AI 大模型接入 SDK】 - DeepSeek 模型接入(上)
开发语言·c++·chatgpt
加号37 小时前
【C#】 串口通信技术深度解析及实现
开发语言·c#
sycmancia8 小时前
Qt——编辑交互功能的实现
开发语言·qt
RyFit8 小时前
SpringAI 常见问题及解决方案大全
java·ai
石山代码8 小时前
C++ 内存分区 堆区
java·开发语言·c++
绝知此事9 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
无风听海9 小时前
C# 隐式转换深度解析
java·开发语言·c#