本篇回答附带视频教程
正文
注解(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.com