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 mysql 连接 “The server requested authentication method unknown to the clien”错误

    查了下,出现这个错误的原因是从mysql 5.6开始,mysql密码加密算法更改了. 我装的mysql 8.* ,那么有两种解决方法: mysql 版本选择 <= 5.6 修改密码 docker ...

  2. Ubuntu 16.04 LTS sublime text 3 解决不能输入中文

    sublime text 3 安装完成后不能输入中文,让人很是不爽.下面内容可以解决使用问题! 一.首先要注意几个问题. 1)sublime_imfix.c 文件放在home目录下面. 2)如果你在步 ...

  3. SurvivalShooter学习笔记(四.敌人攻击)

    此案例中,敌人始终朝着玩家移动 到达攻击玩家范围时(身上的大的触发器被玩家触发时(敌人靠近玩家,当身上的触发器被触发,且对象是玩家时条件达成)) 隔一个时间端,打击玩家一下,对玩家造成伤害,玩家掉血, ...

  4. 《ASP.NET1200例》C#在网页上编写动态时钟

    包含Timer类的命名空间有3个 Timer Class (System.Threading)‎ Timer Class (System.Windows.Forms)‎ 一般用于窗体程序 Timer  ...

  5. servlet ; basepath ; sendredirected ;

    Eclipse 新建 jsp页面里自动生成以下代码: <%String path = request.getContextPath();String basePath = request.get ...

  6. 服务器证书日期无效 SSL_DATE_INVALID

    一大早上,企业微信中提示不能使用:服务器证书日期无效  错误码:SSL_DATE_INVALID 网上资料也比较少,咨询了一下企业微信客服,建议访问网址:https://www.ssllabs.com ...

  7. java编程思想 英文版 打卡

    计划 2017.3.1 购入 准备花一个月的时间阅读完, 共1500页,最后两章是GUI的内容,只需要到1300页就行了 目的有三: 熟悉java基础 提升英语阅读能力,好久没读英文书籍了 补补oop ...

  8. 3 CActiveXUI的一个Bug

    如果主窗口直接用变量生成,则关闭窗口时会产生崩溃            如果用new的方式生成,则不会崩溃,所以给出一个临时的快速解决方案,即主窗口都用new生成,_tWinMain改为下面这样: i ...

  9. windows钩子 Hook示例

    1.首先编写一个 win32 dll工程. #include "stdafx.h" int WINAPI add(int a,int b) { return a+b; } BOOL ...

  10. Pandas 如何去除、取消已经设置好的索引

    Outline 今天处理数据时遇到一个问题: 因为业务需要,我对 df 进行了建立索引. 具体如下: 下面走的是默认索引 给其设置索引: 取消索引 业务需求,我要取消掉上面设置的索引: So,之前设置 ...