在很多人刚刚开始学习注解时,大致会把注解分为五大类,也被称为五大类注解,但是在五大类注解中可以分为两种模式来进行划分。
第一种分类:基于 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的作用:
-
标识控制器类:
- 通过
@Controller注解,Spring 会将标记的类识别为控制器,并将其注册到ApplicationContext中。
- 通过
-
处理 HTTP 请求:
- 配合
@RequestMapping等注解,@Controller定义的方法会映射到指定的 URL,用于处理请求。
- 配合
-
返回视图:
- 默认情况下,
@Controller返回视图名称(如String类型),由视图解析器(ViewResolver)解析
- 默认情况下,
总结:@Controller注解他具有标识注解的作用,也使用了元注解来对他进行定义生命周期,至于后面的@AliasFor注解需要继续解析的话,就靠你们自己去了,哈哈哈哈。
&spm=1001.2101.3001.5002&articleId=143962507&d=1&t=3&u=8cf1289ced3147fe9d2f8f304d8c2d0a)
27万+

被折叠的 条评论
为什么被折叠?



