Annotation简介

Annotation是JDK1.5引入的特性,包含在java.lang.annotation包中。

它是附加在代码中的一些元信息,将一个类的外部信息与内部成员联系起来,在 编译、运行时进行解析和使用(可以理解成Python的装饰器)。

Java内置了一些Annotation(例如 @Override、@Deprecated等),也支持用户定义自己的Annotation,像Hibernate、Spring等框架都大量的自定义了Annotation。

什么是Annotation?

用一个词就可以描述Annotation —— "元数据",一种描述“数据”的“数据”;可以说Annotation就是源代码的“元数据”。

@Override
public String toString() {
return "Annotation Demo";
}

上面的代码中重写了 toString()方法,并使用了@Override Annotation。该Annotation表示什么?有什么用处?实际上@Override会告诉编译器这个方法是一个重写方法,如果父类中不存在该方法,编译器就会报错。

Annotation是一种应用与 类、接口、方法、参数、变量、构造器及包声明中的特殊修饰符,详细内容可以查看枚举ElementType。

为什么要引入Annotation?

在Annotation出现之前,XML被广泛应用关于描述元数据,但是程序员和架构师发现XML的维护越来越麻烦,他们希望使用一些和代码紧耦合的东西,而不是想XML那样和代码是松耦合的,最有趣的是XML配置实际上是为了分离代码和配置而引入的。

假如你想为应用设置很多常量或参数,XML是一个很好的选择,因为它不会和特定的代码相连。如果你想把某个Method声明为服务,那么使用Annotation会更简单、方便一些,因为这种情况下需要Annotation和Method紧密耦合起来。

目前需要框架将XML和Annotation两种方式都结合使用,平衡两者之间的利弊。

Annotation是如何工作的?

先来看看@Override的代码

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

对于@Override你肯定会有疑问,它的内部什么都没做,它是如何检查父类中有没有同名的方法呢?@Override的定义不仅仅只有这么一点代码(注意:Annotation仅仅是元数据,和业务逻辑无关),那@Override到底是如何实现的呢? 答:AnnotationProcessor

Annotation示例代码:https://docs.google.com/file/d/0B1N2DVZFnNU0dVdFVjVFeTVtcXc/edit

AnnotationProcessor

是一个在javac中的,用来编译时扫描和处理的Annotation的工具。一个Annotation的AnnotationProcessor,以Java代码(或者编译过的字节码)作为输入,生成文件(通常是.java文件)作为输出。这具体的含义什么呢?你可以生成Java代码!

生成的Java代码是在新的.java文件中,所以你并不能修改已存在的Java类,例如向已有的类中添加方法。并且这些生成的Java文件,会同其他普通的手动编写的Java源代码一样被javac编译。

元注解

用来标注其它注解而创建的新注解,元注解的类型有以下几种:

@Target:注解所修饰的对象范围

@Inherited:表示注解可以被继承

@Documented:表示这个注解应该被JavaDoc工具记录

@Rentation:用来声明注解的保留策略

@Repeable:JDK8新增,允许一个注解在同一声明类型(类,属性或方法)上多次使用。

自定义Annotation

那么,注解的内部到底是如何定义的呢?Annotations只支持基本类型、String及枚举类型。注释中所有的属性被定义成方法,并允许提供默认值。

示例代码:

01、MyTag类

import java.lang.annotation.*;

@Target({ElementType.METHOD, ElementType.FIELD})
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTag {
String name() default "Car";
int size() default 10;
}

02、Car实体类

public class Car {

    private String name;
private int size; public Car(){ } public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getSize() {
return size;
} public void setSize(int size) {
this.size = size;
} public Car(String name, int size) {
this.name = name;
this.size = size;
} @Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", size=" + size +
'}';
}
}

03、AnnotationDemo

public class AnnotationDemo {

    @MyTag(name = "Audi", size = 100)   // 装配Car这个类
private Car car; public Car getCar(){
return car;
} public void setCar(Car car){
this.car = car;
} @Override
public String toString() {
return "AnnotationDemo{" +
"car=" + car +
'}';
}
}

04、AnnotationProcessor

import java.lang.reflect.Field;

public class AnnotationProcessor {
public static void annotationProcess(AnnotationDemo annotationDemo){
for(Field field: annotationDemo.getClass().getDeclaredFields()){
if(field.isAnnotationPresent(MyTag.class)){ // 如果存在MyTag标签
MyTag myTag = field.getAnnotation(MyTag.class);
annotationDemo.setCar(new Car(myTag.name(), myTag.size()));
}
}
} public static void main(String[] args){
AnnotationDemo annotationDemo = new AnnotationDemo();
annotationProcess(annotationDemo);
System.out.println(annotationDemo.getCar()); }
}

SpringBoot常用Annotation

@Service

@Repository

@Component

@...

SpringBoot @Annotation的更多相关文章

  1. springboot aop 自定义注解方式实现完善日志记录(完整源码)

    版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 一:功能简介 本文主要记录如何使用aop切面的方式来实现日志记录功能. 主要记录的信息有: 操作人,方法名,参数,运行时间,操作类型 ...

  2. springboot aop 自定义注解方式实现一套完善的日志记录(完整源码)

    https://www.cnblogs.com/wenjunwei/p/9639909.html https://blog.csdn.net/tyrant_800/article/details/78 ...

  3. Springboot源码分析之番外篇

    摘要: 大家都知道注解是实现了java.lang.annotation.Annotation接口,眼见为实,耳听为虚,有时候眼见也不一定是真实的. /** * The common interface ...

  4. spring boot 中使用 Redis 与 Log

    spring boot + mybatis + redis 配置 1.application.yml #配置访问的URLserver: servlet-path: /web port: spring: ...

  5. Spring Boot实践——Spring AOP实现之动态代理

    Spring AOP 介绍 AOP的介绍可以查看 Spring Boot实践——AOP实现 与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改 ...

  6. Spring Boot实践——AOP实现

    借鉴:http://www.cnblogs.com/xrq730/p/4919025.html     https://blog.csdn.net/zhaokejin521/article/detai ...

  7. Spring Boot实践——三种拦截器的创建

    引用:https://blog.csdn.net/hongxingxiaonan/article/details/48090075 Spring中的拦截器 在web开发中,拦截器是经常用到的功能.它可 ...

  8. 我把这个贼好用的Excel导出工具开源了!!

    写在前面 不管是传统软件企业还是互联网企业,不管是管理软件还是面向C端的互联网应用.都不可避免的会涉及到报表操作,而对于报表业务来说,一个很重要的功能就是将数据导出到Excel.如果我们在业务代码中, ...

  9. Spring组合注解与元注解

    目录 注解说明 源代码 使用范例 注解说明 元注解:可以注解到别的注解上的注解,所以元注解首先基于条件@Target({ElementType.TYPE}) ,目标使用在类文件上 . 组合注解:连个元 ...

随机推荐

  1. Docker入门与应用系列(九)图形界面管理之Portainer

    介绍 Portainer是一个开源.轻量级Docker管理用户界面,基于Docker API,可管理Docker主机或Swarm集群,支持最新版Docker和Swarm模式.官方文档https://p ...

  2. IIS服务中五种身份验证的灵活运用

    微软IIS服务是一项经典的Web服务,可以为广大用户提供信息发布和资源共享功能.身份认证是保证IIS服务安全的基础机制,IIS支持以下5种 Web 身份认证方法: 一.匿名身份认证 如果启用了匿名访问 ...

  3. Array转为Json需要导入的包

    今天自己写了一个JSON的例子,可以一调用就出了问题,报下面这个异常: java.lang.ClassNotFoundException: org.apache.commons.lang.except ...

  4. [原创]adb使用教程v1.1.0-----by-----使用logcat快速抓取android崩溃日志

    原文再续,书接上回:<使用logcat快速抓取android崩溃日志>中提到的工具包可以下载拉~ <使用logcat快速抓取android崩溃日志>:http://www.cn ...

  5. 活动窗口(Active),焦点窗口(Focus)和前景窗口(Foreground)之间的关系

    活动窗口(Active),焦点窗口(Focus)和前景窗口(Foreground)之间的关系 任何一个时候,我们的Windows桌面上总有一个最前台的窗口,其实说简单的,就是标题栏变成深蓝色的那个窗口 ...

  6. Alcor(安国)AU6387量产修复(u盘修复)

    2010年买的U盘,自从去年坏掉一直没有用. 今天试着把它修理的心态,看看能修好不能.不料真的被我搞好了. 下面是教程链接 如果你的芯片跟我的一样,我人品保证你可以成功. 如果你看教程之后量产 成功, ...

  7. Powershell Get Domain Group的几种方法

    Group常见属性介绍: 一.Get-ADGroup获取群组(如下例循环获取群组的发送权限) #群组的发送权限info $groups=Get-ADGroup -filter * -SearchSco ...

  8. 微信公众号开发 但是服务端仅仅接收到了 p1 p2 没有接收到p3

    w 栗子 js window.location = www.xx.com?p1=123&p2=456&p3=789 但是服务端仅仅接收到了 p1 p2 没有接收到p3 原因有哪些呢? ...

  9. Python菜鸟之路:原生Ajax/Jquery Ajax/IFrame Ajax的选用

    原生Ajax Jquery Ajax IFrame Ajax 如果发送的是普通的数据,比如用户简单的输入.选择的值,推荐使用Jquery ,其次用XMLHttpRquest对象,最次使用IFrame ...

  10. java配置文件properties,yml,一般文件

    JAVA编写配置文件的几种方式: JAVA配置文件,一般都放在resource目录下,无论是下面提到的properties.yml还是普通的txt等文件. 在打成jar包之后,只需要jar包程序就可运 ...