深入理解Java注解(五大类注解)

在很多人刚刚开始学习注解时,大致会把注解分为五大类,也被称为五大类注解,但是在五大类注解中可以分为两种模式来进行划分。

第一种分类:基于 Spring 的功能划分

在 Spring 框架中,有五大类核心注解,用于标识不同类型的 Bean 或配置类。它们是:

1. @Controller

  • 用于定义控制器类。
  • 常与 Spring MVC 搭配使用,用于处理 HTTP 请求,返回视图或数据。

2. @Service

  • 表示服务层的 Bean,主要处理业务逻辑。
  • 在分层架构中位于控制层和持久层之间。

3. @Repository

  • 用于数据访问层,标记 DAO 类。
  • 自动将与数据库操作相关的异常转换为 Spring 的 DataAccessException

4. @Component

  • 表示一个普通的 Spring Bean。
  • @Controller@Service@Repository 的泛化注解。

5. @Configuration

  • 表示一个 Java 配置类,通常用于定义 @Bean 方法。
  • 代替 XML 配置,提供基于 Java 的配置方式。

总结:

这种分类是基于 注解的功能和用途 来划分的,主要面向开发者理解 Spring 的分层架构和 Bean 定义。学习了上面的注解,对于我们开发者来说只是会使用,知道注解是干什么的,想要搞懂注解的底层实现原理,我们还需要学习第二种分类,他从注解的结构进行刨析,帮助我们更好的理解注解,使用注解,学习完后还可以使用自定义注解啦,嘻嘻。

第二种分类:基于注解的语法和设计模式

这种分类是从 注解的编程模型和设计模式 的角度来分析的,是一种更加抽象的理解。以下是五种常见的注解类型:

1. 标识注解(Marker Annotation)

  • 没有方法,仅起到标记作用,具体作用是将注解下面的方法进行标记给容器。
  • 示例:
    // 自定义一个标识注解
    public @interface MyMarkerAnnotation {}
    
    // 使用标识注解
    @MyMarkerAnnotation
    public class MyClass {
        // Class body
    }

2. 单值注解(Single-Value Annotation)

  • 只有一个属性,一般使用 value 作为默认属性名。(里面定义了一个属性,那么我们就可以通过这个属性来进行传值)
  • 示例:
    // 定义一个单值注解
    public @interface SingleValueAnnotation {
        String value(); // 单个元素
    }
    
    // 使用单值注解
    @SingleValueAnnotation("value = Hello, World!") //这里传了一个Hello, World!
    public class MyClass {
        // Class body
    }

3. 完整注解(Full Annotation)

  • 有多个属性,通常需要显式设置。
  • 示例:
    // 定义一个完整注解
    public @interface FullAnnotation {
        String name();
        int age() default 18; // 提供默认值,age默认为18,address默认为Unknown
        String address() default "Unknown";
    }
    
    // 使用完整注解
    @FullAnnotation(name = "John", age = 30, address = "New York")
    public class Person {
     private String name;
        private int age;
        private String address;
        // Class body
    }

    注(重点):这时候就有老铁会问注解中的参数有什么作用?

        答:注解的作用呢是告诉编译器一些信息,这里注解的作用是告诉编译器,Person方法里面会携带 name,age,address这三个参数(但是并不是给Person方法传John,30,New Yourk这三个参数啊,只是做一个例子)        切记切记:注解的作用就是为程序提供格外信息。

4. 元注解(Meta-Annotation)

  • 元注解是用于定义其他注解的注解。Java 提供了四个元注解,用来描述如何使用其他注解。它们分别是:

  • @Retention:定义注解的生命周期。
  • @Target:指定注解可以应用的地方(类、方法、字段等)。
  • @Inherited:标记注解可以被子类继承。
  • @Documented:标记注解将包含在 Javadoc 中。
  • 示例:
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    // 元注解定义一个注解只能用于方法
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface MyCustomAnnotation {
        String description();
    }
    
    // 使用自定义注解
    public class MyClass {
        @MyCustomAnnotation(description = "This is a method annotation")
        public void myMethod() {
            // Method body
        }
    }

5. 重复注解(Repeating Annotation)

  • 支持在同一目标上重复声明多次。
  • Java 8 引入的特性,通过 @Repeatable 实现。
  • 示例:
    import java.lang.annotation.Repeatable;
    
    // 定义一个重复注解的容器
    @Repeatable(MyAnnotations.class)   
       //这一步相当关键,它的作用是将某个注解(如 @MyAnnotation)标记为可重复,并指定一个容器注解(如 @MyAnnotations)来保存多个该注解的实例。
    public @interface MyAnnotation {
        String value();
    }
    
    // 定义重复注解的容器
    public @interface MyAnnotations {
        MyAnnotation[] value();
    }
    
    // 使用重复注解
    @MyAnnotation("First")
    @MyAnnotation("Second")
    public class MyClass {
        // Class body
    }

总结:

这种分类是基于 注解的结构和使用模式 的角度,更加面向语言设计和注解使用的灵活性。仔细理解以上分类,可以刨析注解结构,有利于以后我们使用自定义注解。


两种分类的对比:

维度Spring 五大注解分类编程模型注解分类
角度功能和用途注解的设计模式和结构
关注点注解如何与 Spring 结合使用注解的语言特性及其技术实现
代表注解@Controller@Service@Override@Repeatable
应用场景Spring 项目开发Java 注解开发,设计自定义注解

解析@Controller注解:

OK啦兄弟们,学习了第二种五大类注解,我们再来深入理解第一类五大类注解就很简单了,这里举例一个@Controller注解吧,我们打开idea,随便写一个@Controller,然后右键点开@Controller的源码:

查看注解源码:

  • @Target(ElementType.TYPE)@Controller 可以用于类或接口上。
  • @Retention(RetentionPolicy.RUNTIME):注解会在运行时保留,可以通过反射获取。
  • @Documented:作用是指明该注解会被包含在javadoc文档中。
  • @Component@Controller 是一个特殊的 @Component,会被 Spring 扫描并注册为 Bean。
  • value():可以通过它给控制器定义一个名称(通常不设置,默认使用类名首字母小写)。

而我们再看看@Controller的作用:

  1. 标识控制器类

    • 通过 @Controller 注解,Spring 会将标记的类识别为控制器,并将其注册到 ApplicationContext 中。
  2. 处理 HTTP 请求

    • 配合 @RequestMapping 等注解,@Controller 定义的方法会映射到指定的 URL,用于处理请求。
  3. 返回视图

    • 默认情况下,@Controller 返回视图名称(如 String 类型),由视图解析器(ViewResolver)解析

总结:@Controller注解他具有标识注解的作用,也使用了元注解来对他进行定义生命周期,至于后面的@AliasFor注解需要继续解析的话,就靠你们自己去了,哈哈哈哈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值