17.JavaWeb-注解

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

        当Spring容器启动时,会自动扫描并实例化MyAnnotationProcessor并将其作为 BeanPostProcessor 应用于容器中的所有 Bean。当容器初始化 Bean 的过程中,会调用 postProcessBeforeInitialization 方法,实现对带有 @MyAnnotation 注解的方法进行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值