Java基础-注解

一、作用

  • 生成文档,通过代码里标识的元数据生成javadoc文档。

  • 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。

  • 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。

  • 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。

二、Java内置注解

  • @Override:表示当前的方法定义将重写父类中的方法

  • @Deprecated:表示代码被弃用,如果使用了被@Deprecated注解的代码则编译器将发出警告

  • @SuppressWarnings:表示关闭编译器警告信息

三、元注解

@Target

作用:描述注解的使用范围(即:被修饰的注解可以用在什么地方)

Target注解用来说明那些被它所注解的注解类可修饰的对象范围:注解可以用于修饰 packages、types(类、接口、枚举、注解类)、类成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数),在定义注解类时使用了@Target 能够更加清晰的知道它能够被用来修饰哪些对象,它的取值范围定义在ElementType 枚举中。

public enum ElementType {
 
    TYPE, // 类、接口、枚举类
 
    FIELD, // 成员变量(包括:枚举常量)
 
    METHOD, // 成员方法
 
    PARAMETER, // 方法参数
 
    CONSTRUCTOR, // 构造方法
 
    LOCAL_VARIABLE, // 局部变量
 
    ANNOTATION_TYPE, // 注解类
 
    PACKAGE, // 可用于修饰:包
 
    TYPE_PARAMETER, // 类型参数,JDK 1.8 新增
 
    TYPE_USE // 使用类型的任何地方,JDK 1.8 新增
 
}

@Retention & @RetentionTarget

Reteniton注解用来限定那些被它所注解的注解类在注解到其他类上以后,可被保留到何时,一共有三种策略,定义在RetentionPolicy枚举中。

public enum RetentionPolicy {
 
    SOURCE,    // 源文件保留
    CLASS,       // 编译期保留,默认值
    RUNTIME   // 运行期保留,可通过反射去获取注解信息
}

@Documented

使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息。

@Inherited

被它修饰的Annotation将具有继承性。如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解。

自定义注解和AOP - 通过切面实现解耦

自定义注解(Custom Annotations)结合面向切面编程(Aspect-Oriented Programming,AOP)是一种强大的组合,可以实现关注点的分离和代码的解耦。通过这种方式,你可以将业务逻辑与横切关注点(如日志、安全、事务管理等)分离开来,从而使代码更加模块化和可维护。

自定义注解

自定义注解允许你定义新的注解类型,并指定它们可以应用的位置(如方法、字段、类等),以及它们在运行时是否可用。自定义注解通常用于提供元数据,这些元数据可以在运行时通过反射读取并处理。

例如,以下是一个简单的自定义注解,用于标记需要日志记录的方法:

@Retention(RetentionPolicy.RUNTIME) // 注解在运行时可用
@Target(ElementType.METHOD) // 注解只能应用于方法
public @interface Loggable {
    // 可以添加注解属性
}

AOP

AOP允许你定义切面(aspects),切面是跨多个类和模块的横切关注点的模块化表示。在Java中,AOP通常与Spring框架一起使用,并通过Spring AOP或AspectJ实现。

切面可以定义切点(pointcuts),这些切点匹配特定的执行点,如方法调用或字段赋值。切面还可以定义通知(advice),即在切点匹配的执行点之前、之后或周围执行的代码。

结合使用

结合自定义注解和AOP,你可以创建一个切面,该切面包含一个切点,它匹配所有带有你自定义注解的方法。然后,你可以为这个切点添加通知,以实现你想要的横切逻辑。

以下是一个简单的示例,演示如何结合使用自定义注解和AOP来实现方法调用的日志记录:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
//自定义注解
public @interface Loggable {
    // 注解属性
}
//切面
@Aspect
@Component
public class LoggingAspect {
    @Around("@annotation(Loggable)") // 切点表达式,匹配带有@Loggable注解的方法
    public Object logMethodCall(ProceedingJoinPoint joinPoint) throws Throwable {
        String methodName = joinPoint.getSignature().getName();
        System.out.println("Before method: " + methodName);
        Object result = null;
        try {
            result = joinPoint.proceed(); // 继续执行原方法
        } finally {
            System.out.println("After method: " + methodName);
        }
        return result;
    }
}

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值