Java注解概述

Java 注解可以理解为元数据,所谓元数据即是描述数据的数据,如我们平时用的hibernate,就可以注解的方式描述model信息:

@Entity
@Table(name="teams")
public class Team {
 @Id
 @GeneratedValue
 private Integer id;
 @Column(nullable = false)
 private String name;
 private Integer rating;
} 

通过注解,指定实体类Team与teams 呈映射关系,并且id为表的主键,表中name列不能为null。这些也可以通过xml文件配置,那么相比于xml文件,两者有什么区别吗?举一个例子,我们使用SpringMVC开发WebApp的时候,常有一个application.xml文件,配置sessionFactory,transactionManager这些通用的组件,这部分组件不和任何特定的代码相关联;而一些Controller,Service,则通过注解(@Conroller,@Service)的形式配置,因为这部分代码与注解中的信息紧密耦合,这增强了代码的可读性。

自定义注解是比较简单的,与定义接口非常类似:

如上面@Column的定义:

@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface Column {
    String name() default "";
 boolean unique() default false;
 boolean nullable() default true;
 boolean insertable() default true;
 boolean updatable() default true;
    String columnDefinition() default "";
    String table() default "";
 int length() default 255;
 int precision() default 0;
 int scale() default 0;
}

自定义注解需要使用以下注解:

@Documented – 表示在生产 JavaDoc 文档的时候把注解信息也包含进去

@Retention – 表示该注解的级别。可选的范围有:

SOURCE : 只在源代码里出现,编译后就被丢弃了,如@Override, @SuppressWarnings

CLASS : 会被编译到 class 文件里。

RUNTIME : 在 JVM 加载 class 文件的时候,也会把注解的信息加载进去,

可用于运行时反射,自定义注解时常用的级别。

@Target – 表示该注解的作用位置

@Inherited – 表示子类运行继承父类的注解。

记住,注解仅仅是元数据(为类,方法,字段,包提供信息),它本身并不包含任何的业务逻辑,通常另有一块代码来读取注解中的信息,处理相应的业务逻辑。

请看示例:

注解的定义:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TInfo {
  String fieldName() default "";
}

注解的使用:

public class Item {
 private int id;
 @TInfo(fieldName="商品名称")
 private String name;
 @TInfo(fieldName="商品数据")
 private int count;
}

注解的处理类(需要使用反射):

public class Consumer {
 public static void annoInfo(Class<?> clazz){
 Field[] fields = clazz.getDeclaredFields();// 得到指定类的所有属性Field.  
 // 打印注解信息  
 for (Field field : fields) {  
 if (field.isAnnotationPresent( TInfo.class)) {  
     System.out.println(field 
      .getAnnotation(TInfo.class).fieldName());
   }  
 }  
 }
public static void main(String[] args){
 annoInfo(Item.class);
}
}

原文发布于微信公众号 - java达人(drjava)

原文发表时间:2016-04-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏10km的专栏

velocity:宏(#macro)出现中文乱码

最开始使用velocity时,输出中文乱码,我的解决办法 是在调用 mergeTemplate 方法时指定encoding为UTF-8,然后就正常了。 Velo...

2365
来自专栏小勇DW3

AOP中使用Aspectj对接口访问权限进行访问控制

只配置这段会报:The prefix "aop" for element "aop:aspectj-autoproxy" is not bound.

1774
来自专栏SpringSpace.cn

使用 Postman 与 Kotlin 交互REST API接口数据 顶

在前面2篇文章使用 Kotlin 和Spring Boot 2.0快速开发REST API接口和使用 Kotlin 和Spring Boot 2.0快速开发RE...

1613
来自专栏移动开发

利用Gson将对象转换成json,忽略某些字段的方法

有时我们将对象转换成json格式的字符串时,并不希望里面所有的字段都转换,我们可能希望忽略某些.默认的gson是全部转换的,为此要给gson做一些配置.其实Gs...

5293
来自专栏JavaEdge

Spring 5.0中文版-3.9

3499
来自专栏lgp20151222

Spring注解之@Lazy注解,源码分析和总结

关于延迟加载的问题,有次和大神讨论他会不会直接或间接影响其他类。spring的好处就是文档都在代码里,网上百度大多是无用功。

1533
来自专栏battcn

一起来学SpringBoot | 第二十二篇:轻松搞定重复提交(分布式锁)

在 一起来学SpringBoot | 第二十二篇:轻松搞定重复提交(一) 一文中介绍了 单机版的重复提交解决方案,在如今这个分布式与集群横行的世道中,那怎么够用...

3243
来自专栏程序猿DD

【译】Spring 官方教程:创建批处理服务

原文:Creating a Batch Service 译者:Mr.lzc 校对:lexburner 本指南将引导你完成创建基本的批处理驱动解决方案的过程。 你...

5467
来自专栏Bug生活2048

Spring Boot学习笔记(六)结合MyBatis实现较为复杂的RESTful API

首先看下要实现的效果吧,完成下面截图部分的API,除了CRUD之外,分页查询也是使用的比较多的。

903
来自专栏猿天地

注解面试题-请了解下

金三银四,三四月是找工作最好的时期。错过了三月千万别放弃四月。 在面试的时候,有些面试官会问注解相关的问题, 注解最典型的代表框架就是Spring了,特别是Sp...

3599

扫码关注云+社区

领取腾讯云代金券