1.注解的概念
注解(Annotation)是一种元数据的表示方式,用于给代码添加额外的信息、配置或指示。注解以特定的语法规则或标记标识,并可以应用于类、方法、字段、参数等程序元素上。
1.1 注解的作用
1.1.1 提供额外的元数据信息
注解可以用于提供额外的信息,如作者、版本号、创建时间等。这些信息可以被编译器、框架或工具读取和利用,例如生成文档、生成代码等。
1.1.2 配置程序行为
注解可以用于配置程序的行为,通过在代码中添加注解,可以告诉框架或工具如何处理代码。例如,使用注解来实现依赖注入、事务管理、路由映射等功能。
1.1.3 实现编译时检查
某些注解可以在编译时进行静态检查,以确保代码的正确性或符合特定的规范。例如,@Override注解可以确保子类正确地重写了父类的方法,@SuppressWarnings注解可以抑制编译器的警告。
1.1.4 自动生成代码
某些框架或工具可以根据注解自动生成代码,以简化开发过程。例如,基于Hibernate的ORM框架可以根据实体类上的注解自动生成数据库表结构,基于Spring MVC的框架可以根据控制器类上的注解生成路由映射。
1.1.5 运行时处理
在程序运行时,可以使用反射机制读取和处理注解信息,从而实现动态的行为。例如,JUnit框架可以通过读取测试方法上的注解来执行单元测试。
1.1.6 元编程
注解可以用于编写更高级的代码生成工具或框架。通过读取和处理注解信息,可以实现自定义的代码生成、代码分析、代码转换等功能。
2.内置注解
注解 | 描述 |
---|---|
@Override |
标记方法覆盖父类的方法,编译器会检查方法名和参数是否正确。 |
@Deprecated |
标记不推荐使用的方法或类,编译器会给出警告。 |
@SuppressWarnings |
抑制编译器的警告信息,用于忽略特定类型的警告。 |
@FunctionalInterface |
标记函数式接口,确保接口只有一个抽象方法,以便于使用 Lambda 表达式。 |
@SafeVarargs |
标记方法参数为可变参数,并确保方法不会产生类型不安全的警告。 |
3.元注解
元注解是指用于注解其他注解的注解,即用于定义和配置注解的注解,元注解提供了对注解进行更精细控制和配置的能力
注解 | 描述 |
---|---|
@Target |
指定注解可以应用的目标元素类型,例如类、方法、字段等。 |
@Retention |
指定注解的生命周期,即注解在运行时是否可用。 |
@Documented |
指定注解是否应该被包含在 Java 文档中。 |
@Inherited |
指定注解是否可以被继承。 |
4.自定义注解
【基于Spring框架】
4.1 创建注解类
使用 @interface 关键字定义一个注解类型,注解类型的名称应遵循驼峰式
public @interface MyAnnotation {}
4.2 添加元注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD) | 表示该注解可以应用在方法上 |
@Retention(RetentionPolicy.RUNTIME) | 表示该注解在运行时保留,可以通过反射机制读取 |
4.2 定义注解元素
注解元素类似于接口的方法,可以有返回值和默认值
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "";
int priority() default 0;
// 其他属性...
}
4.3 使用自定义注解
在需要的地方通过@注解名称即可
@MyAnnotation(value = "custom", priority = 1)
public void doSomething() {}
4.4 处理注解
在需要处理自定义注解的代码中,通过反射机制读取注解信息,并进行相应的处理逻辑。可以使用java.lang.reflect包中的类和方法来获取注解信息
@Component
public class MyAnnotationProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
Class<?> beanClass = bean.getClass();
Method[] methods = beanClass.getDeclaredMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
// 读取注解信息,并进行相应的处理逻辑
String value = annotation.value();
int priority = annotation.priority();
}
}
return bean;
}
}
BeanPostProcessor 接口是 Spring 框架提供的一个扩展接口,用于在 Bean 实例化和初始化的过程中插入自定义的处理逻辑。通过实现 BeanPostProcessor 接口,可以对容器中的 Bean 进行统一的前置处理和后置处理操作。
postProcessBeforeInitialization方法会在每个Bean初始化之前调用,在方法内部,先获取到当前Bean的类对象bean.class,然后通过反射获取该类中声明的所有方法,并遍历这些方法判断是否有@MyAnnotation注解
如果存在 MyAnnotation 注解,通过 method.getAnnotation(MyAnnotation.class) 方法获取到方法上的注解对象,并可以进一步读取注解中定义的属性值,例如 value 和 priority文章来源:https://www.toymoban.com/news/detail-556780.html
当Spring容器启动时,会自动扫描并实例化MyAnnotationProcessor并将其作为 BeanPostProcessor 应用于容器中的所有 Bean。当容器初始化 Bean 的过程中,会调用 postProcessBeforeInitialization 方法,实现对带有 @MyAnnotation 注解的方法进行处理。文章来源地址https://www.toymoban.com/news/detail-556780.html
到了这里,关于17.JavaWeb-注解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!