当前位置: 首页 > wzjs >正文

湖北省城乡住房建设厅网站网站模板设计教程

湖北省城乡住房建设厅网站,网站模板设计教程,营销渠道的三个类型,浦东注册公司流程和费用Java注解(Annotation)是一种强大的元数据机制,为代码提供了附加信息,能简化配置、增强代码的可读性和可维护性。本文将深入探讨 Java 注解的相关知识。首先阐述了注解的基础概念,包括其本质、作用以及核心分类&#xf…

        Java注解(Annotation)是一种强大的元数据机制,为代码提供了附加信息,能简化配置、增强代码的可读性和可维护性。本文将深入探讨 Java 注解的相关知识。首先阐述了注解的基础概念,包括其本质、作用以及核心分类(内置注解、元注解、自定义注解)。接着深入讲解元注解,如@Target、@Retention、@Documented、@Inherited、@Repeatable等,解释了它们的用途和使用方式。还介绍了自定义注解的定义语法、属性类型限制及默认值设置,以及常见应用场景等。

本文目录

    • 一、注解基础概念
      • 1.1 本质与作用
      • 1.2 核心注解分类
    • 二、元注解详解
      • 2.1 @Target
      • 2.2 @Retention
      • 2.3 @Documented
      • 2.4 @Inherited
      • 2.5 @Repeatable
    • 三、自定义注解
      • 3.1 定义语法
      • 3.2 属性类型限制
      • 3.3 默认值
    • 四、注解处理方式
      • 4.1 编译时处理
      • 4.2 运行时处理
    • 五、常见应用场景
      • 5.1 框架配置
      • 5.2 API文档生成
      • 5.3 数据校验
      • 5.4 AOP切面编程
      • 5.5 单元测试
    • 六、工作日常实战应用
      • 6.1 接口权限控制注解
      • 6.2 基于角色的接口权限校验
    • 七、注解使用重要注意点
      • 7.1 注解继承问题
      • 7.2 默认值约束
      • 7.3 性能开销
    • 八、总结

一、注解基础概念

1.1 本质与作用

        注解本质上是元数据,它为代码提供了额外的信息,例如配置信息、标记信息或校验规则等。重要的是,注解并不直接影响代码的逻辑执行。在编译期或运行时,Java可以通过反射机制读取和处理这些注解,从而实现一些自动化的操作。

1.2 核心注解分类

  • 内置注解:Java提供了一些内置的注解,像@Override用于检查方法是否正确重写,@Deprecated用于标记某个方法或类已经废弃,@SuppressWarnings则可以抑制编译器产生的警告信息。
  • 元注解:元注解是用于定义其他注解的注解,常见的有@Target@Retention等。
  • 自定义注解:开发时可以根据具体的业务需求来定义自己的注解。


二、元注解详解

2.1 @Target

@Target注解用于指定一个注解可以应用的目标范围,它通过ElementType枚举来指定。例如:

@Target({ElementType.METHOD, ElementType.TYPE})
public @interface CustomAnnotation {}

常见的目标类型包括TYPE(类或接口)、METHOD(方法)、FIELD(字段)、PARAMETER(参数)等。

2.2 @Retention

@Retention注解定义了注解的保留策略,通过RetentionPolicy枚举来指定。有以下几种策略:

  • SOURCE:注解仅在源码级别存在,编译后会被丢弃,例如@Override
  • CLASS:注解会保留到字节码文件中,但在运行时不可见(默认策略)。
  • RUNTIME:注解在运行时可以通过反射机制读取,例如Spring的@Autowired

2.3 @Documented

@Documented注解用于标记一个注解是否应该包含在Javadoc中。

2.4 @Inherited

@Inherited注解允许子类继承父类的注解,但需要注意的是,它仅对类有效,对方法和字段无效。

2.5 @Repeatable

@Repeatable注解允许在同一位置重复使用同一个注解,不过需要配合一个容器注解一起使用。示例如下:

@Repeatable(Authorities.class)
public @interface Authority {String value();
}public @interface Authorities {Authority[] value();
}



三、自定义注解

3.1 定义语法

自定义注解使用@interface关键字来定义,例如:

public @interface Loggable {String module() default "log"; // 属性可设默认值boolean enable() default true;
}

3.2 属性类型限制

注解的属性类型有一定的限制,仅支持基本类型、StringClass、枚举、其他注解以及它们的数组。

3.3 默认值

可以通过default关键字为注解的属性指定默认值。如果一个属性没有默认值,那么在使用该注解时必须为其赋值。


四、注解处理方式

4.1 编译时处理

在编译时,可以使用APT(Annotation Processing Tool)来处理注解并生成代码。例如,Lombok的@Data注解就是通过APT来生成getter、setter等方法的。要实现编译时注解处理,需要实现AbstractProcessor并注册处理器。

4.2 运行时处理

在运行时,可以通过Java的反射API来读取注解信息。示例代码如下:

Method method = obj.getClass().getMethod("methodName");
if (method.isAnnotationPresent(Loggable.class)) {Loggable loggable = method.getAnnotation(Loggable.class);System.out.println(loggable.module());
}



五、常见应用场景

5.1 框架配置

在许多Java框架中,注解被广泛用于配置。例如,Spring的@Component用于标记一个类为Spring的组件,@Autowired用于自动注入依赖;JPA的@Entity用于标记一个类为实体类。

5.2 API文档生成

Swagger是一个常用的API文档生成工具,它使用@ApiOperation@ApiParam等注解来描述API接口的信息,从而自动生成详细的文档。

5.3 数据校验

Hibernate Validator提供了一系列的注解,如@NotNull@Size等,用于对数据进行校验。例如:

public class UserRegisterRequest {@NotBlank(message = "用户名不能为空")private String username;@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式错误")private String phone;@Email(message = "邮箱格式错误")private String email;
}// 在Controller层自动校验
@PostMapping("/register")
public ResponseEntity<?> registerUser(@Valid @RequestBody UserRegisterRequest request) {// 处理注册逻辑
}

5.4 AOP切面编程

可以使用自定义注解来标记需要进行增强的方法,然后通过AOP来实现切面编程。例如:

@Around("@annotation(com.example.Loggable)")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {// 记录方法日志return joinPoint.proceed();
}

5.5 单元测试

在单元测试中,JUnit使用@Test注解来标记一个测试方法,@BeforeEach注解用于在每个测试方法执行前执行一些初始化操作。


六、工作日常实战应用

6.1 接口权限控制注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequireRole {String[] value(); // 允许访问的角色(如"ADMIN", "USER")
}

6.2 基于角色的接口权限校验

@RestController
public class OrderController {@RequireRole({"ADMIN", "OPERATOR"}) // 仅允许管理员和运营@GetMapping("/orders")public List<Order> listAllOrders() {// 查询所有订单}// 权限校验切面@Aspect@Componentpublic static class RoleCheckAspect {@Around("@annotation(requireRole)")public Object checkRole(ProceedingJoinPoint joinPoint, RequireRole requireRole) throws Throwable {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();String userRole = (String) request.getAttribute("currentUserRole");if (!Arrays.asList(requireRole.value()).contains(userRole)) {throw new AccessDeniedException("Permission denied");}return joinPoint.proceed();}}
}



七、注解使用重要注意点

7.1 注解继承问题

默认情况下,子类不会继承父类方法上的注解。如果需要继承,需要使用@Inherited注解,并且父类注解的@Retention策略必须为RUNTIME

7.2 默认值约束

注解的属性不能为null,需要使用默认值或空字符串、空数组等来替代。

7.3 性能开销

频繁使用反射来读取运行时注解可能会影响性能,可以通过缓存来优化,例如:

private static final Map<Method, RequireRole> roleCache = new ConcurrentHashMap<>();public static RequireRole getRequireRole(Method method) {return roleCache.computeIfAbsent(method, m -> m.getAnnotation(RequireRole.class));
}



八、总结

        Java注解是一种强大而灵活的机制,它可以显著提升代码的可维护性和开发效率。通过深入理解注解的基础概念、元注解、自定义注解、处理方式以及应用场景,可以在实际项目中合理地运用注解帮助我们实现权限控制、日志记录、数据校验等功能。



← 上一篇 Java进阶——Stream流以及常用方法详解
记得点赞、关注、收藏哦!
下一篇 Java进阶——数据类型深入解析 →

文章转载自:

http://EEiiBsKH.bxbkq.cn
http://0ueeBpDZ.bxbkq.cn
http://Ub6Ce10s.bxbkq.cn
http://TSNZIW8Z.bxbkq.cn
http://1rnMyeb8.bxbkq.cn
http://JYJgQnG7.bxbkq.cn
http://04Kw7Ytz.bxbkq.cn
http://LaHYivzO.bxbkq.cn
http://0hCu1Jyu.bxbkq.cn
http://xCKOchjE.bxbkq.cn
http://5LeID9GC.bxbkq.cn
http://YUeZ4F2T.bxbkq.cn
http://63G6QHVy.bxbkq.cn
http://yX3U771z.bxbkq.cn
http://QgRLqKiQ.bxbkq.cn
http://8XIkmuP9.bxbkq.cn
http://DfyRExkn.bxbkq.cn
http://phH6Cedg.bxbkq.cn
http://Lrr87NiL.bxbkq.cn
http://4HYZHitj.bxbkq.cn
http://TkGwXXib.bxbkq.cn
http://wMfaF3mm.bxbkq.cn
http://Zbqz0tjh.bxbkq.cn
http://Mq9bppPZ.bxbkq.cn
http://ZhHRxPdD.bxbkq.cn
http://RZbhwF6t.bxbkq.cn
http://sNv1Fju7.bxbkq.cn
http://PC7AcqaT.bxbkq.cn
http://0NZQpXqs.bxbkq.cn
http://VXG3XGMC.bxbkq.cn
http://www.dtcms.com/wzjs/640426.html

相关文章:

  • 签约网站做PPT网站建设需要哪些步骤
  • 快递系统查询网站怎么做钢筋网片价格多少钱一吨
  • 简单的公司网站系统西安企业网站建设高新区
  • 网站代运营推广网站审核要多久
  • 百度的网站建设代码wordpress 提权
  • com网站是用什么做的在地区做网站怎么赚钱
  • 营销型网站的评价浙江省龙泉市建设局网站
  • 网站建设基础教程人教版建设部网站监理工程师查询
  • 网站后台管理系统破解电影资源网站建设
  • 公司网站传图片如何在虚拟主机一键安装wordpress
  • 介绍移动互联网的网站有哪些网页编辑用什么软件
  • 做网站哪里的好门户网站开发工具软件
  • 晋中城市建设招标网站网站 301
  • o2o平台网站开发用dede做网站去掉版权
  • 临沂网站设计建设微官网怎么制作
  • 帮做网站的遵义服务好的网站建设公司
  • 做怎样的企业网站公司做外地网站
  • 稳稳在哪个网站做的消防直播php大型综合网站源码
  • 网站设计公司哪个好青岛网站推
  • 花乡做网站公司饭店餐厅网站建设
  • 新开河街网站建设公司东莞保安公司投诉电话
  • 多语言网站多域名推广网站建设注意细节问题
  • 网站建设和实现企查查企业信息查询平台
  • 做网站用asp好吗阿里云怎么做淘客网站
  • 线上教学网站怎么建设app开发工具哪个好
  • 一个刚做好的网站怎么做seo网站建设设计师
  • 广州手机模板建站o2o商城源码
  • 网站建设属于什么工作微信公众号网站建设游戏
  • 龙华建网站公司哪个网站的域名到期直接注册表
  • 做网站链接怎么弄本地wordpress 跳转