java自定义注解处理器_java中,注解处理器怎么定义和使用?

本篇回答附带视频教程

正文

注解(Annotation)概念

注解是Java SE 5.0版本开始引入的概念,它是对java源代码的说明,是一种元数据(描述数据的数据)。

注解和注释的不同注释

注释是对代码的说明,给代码的读者看,便于帮读者梳理业务逻辑;注解

注解也是对代码的说明,需要配合工具(解析它的代码)使用,参与代码的编译,给应用程序看的;

为什么出现注解?

在频繁使用注解之前,是用xml 来作为元数据使用,在最开始使用ssm(Spring,SpringMVC,Mybatis)框架时,bean与bean之间的依赖关系是通过xml文件来配置,这个xml文件和源代码分散,当微服务、分布式注解流行,系统越来越大,需要越来越多的xml文件来配置管理,文件配置冗长,而且类型不安全(运行期才会发现错误),此时就需要一种比较简单直观而且类型安全的配置方式,注解就应运而生了,按照Springboot“约定大于配置”的方式,通过注解来约定其含义,更是减少了xml配置文件的数量。

对于一些经常变动或者配置复杂的配置,使用xml文件来说是比较合适的,所以现在经常是注解和xml方式共存。

注解分类

注解以@开头,我们会在应用程序中见到各种各样的注解,比如@Autowired,@Service,@Controller,@Override ,@Test,@Value等等,按照来源划分,可以分为 JDK的注解,第三方的注解,自定义注解。

JDK注解Java 内置三大注解

@Override (标记重写方法)

@Deprecated (标记过时)

@SuppressWarnings (忽略警告)

元注解 (注解的注解)@Target (注解的作用目标)

@Retention (注解的生命周期)

@Document (注解是否被包含在JavaDoc中)

@Inherited (是否允许子类集成该注解)

第三方注解(主要来源于各种框架)

Spring注解 @RequestMapping,@RestController,@Configuration,@Value,@Controller,@Service,@Repository,@Component等

SpringBoot注解

@SpringBootApplication,@EnableAutoConfiguration等

JPA注解

@Table,@Entity,@Column,@Id等

……

自定义注解

使用元注解自己定义的注解

什么是注解?

在程序代码中经常看到的以@ 开头的大部分是注解;

注解定义的格式

修饰符 @interface 注解名 {

注解元素的声明1

注解元素的声明2

}

注解的元素声明的两种形式

type elementName();

type elementName() default value;

注解定义实例

我们来看下@Service 注解

// ElementType.TYPE 代表在注解上使用@Target({ElementType.TYPE})

// RetentionPolicy.RUNTIME 代表运行时使用,可以通过反射获取到@Retention(RetentionPolicy.RUNTIME)

//包含在JavaDoc中@Documented

//允许通过包扫描的方式自动检测@Component

public @interface Service {

/*** The value may indicate a suggestion for a logical component name,* to be turned into a Spring bean in case of an autodetected component.* @return the suggested component name, if any (or empty String otherwise)*/

@AliasFor(annotation = Component.class)

String value() default "";

}

Annotation 注解

package java.lang.annotation;

/*** The common interface extended by all annotation types. Note that an* interface that manually extends this one does not define* an annotation type. Also note that this interface does not itself* define an annotation type.** More information about annotation types can be found in section 9.6 of* The Java™ Language Specification.** The {@link java.lang.reflect.AnnotatedElement} interface discusses* compatibility concerns when evolving an annotation type from being* non-repeatable to being repeatable.** @author Josh Bloch* @since 1.5*/

public interface Annotation {

}

# The common interface extended by all annotation types.Also note that this interface does not itself define an annotation type.

# 所有的注解默认继承了Annotation接口,但是它本身不能定义注解。

也就是说,我们见到的所有注解,默认是一个实现了Annotation接口的接口。

如何实现自定义注解及注解如何使用

注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。

注解的基本元素

声明一个注解要用到的东西修饰符

访问修饰符必须为public,不写默认为pubic;关键字

关键字为@interface;注解名称

注解名称为自定义注解的名称,使用时还会用到;注解类型元素

注解类型元素是注解中内容,可以理解成自定义接口的实现部分;

public @interface Info {

String value() default "tracy";

boolean isDelete();

}

使用元注解修饰注解

JDK中有一些元注解,主要有@Target,@Retention,@Document,@Inherited用来修饰注解。

@Target

表明该注解可以应用的java元素类型

@Retention

表明该注解的生命周期

@Document

表明该注解标记的元素可以被Javadoc 或类似的工具文档化

@Inherited

表明使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解

@Target({ElementType.FIELD, ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface Info {

String value() default "tracy";

boolean isDelete();

}

使用自定义注解

配置注解

定义了一个Person类

@Data

@Builder

// 为Person类配置了刚刚定义的注解@Info@Info(isDelete = true)

public class Person {

/*** 姓名*/

private String name;

/*** 年龄*/

private int age;

/*** 是否有效*/

private boolean isDelete;

}

利用反射解析注解

public class AnnotationTest {

public static void main(String[] args) {

try {

//获取Person的Class对象 Person person = Person.builder().build();

Class clazz = person.getClass();

//判断person对象上是否有Info注解 if (clazz.isAnnotationPresent(Info.class)) {

System.out.println("Person类上配置了Info注解!");

//获取该对象上Info类型的注解 Info infoAnno = (Info) clazz.getAnnotation(Info.class);

System.out.println("person.name :" + infoAnno.value() + ",person.isDelete:" + infoAnno.isDelete());

} else {

System.out.println("Person类上没有配置Info注解!");

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

运行结果:

对于一个类或者接口来说,Class类(java.lang包下)中提供了一些方法用于反射注解,当然对于字段、方法来说反射注解的方式很类似。

//返回指定的注解getAnnotation

//判断当前元素是否被指定注解修饰isAnnotationPresent

//返回所有的注解getAnnotations

————————————————

版权声明:本文为CSDN博主「大白快跑8」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

Java基本功修炼之自定义注解

课程目标:学习完本课程,可以熟练掌握JDK自带的注解;熟练掌握自定义注解的开发过程.并且用反射+注解完成自动生成建表语句的功能;

适用人群:本课程适合于熟练掌握Java,MySql数据库及其JDBC经验的相关人群;

课程概述:Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。

环境参数:WINDOW32位或64位/JDK1.8/MySql5.5/Eclipse

视频教程链接:Java基本功修炼之自定义注解|Java SE视频课程 - 蛙课视频​www.wkcto.com80eddc29073e397a8358aefca2dc8065.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值