`
weitao1026
  • 浏览: 1047555 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring自定义注解

 
阅读更多

java注解:附在代码中的一些元信息,用于在编译、运行时起到说明、配置的功能。

 

一、元注解

java提供了4种元注解用于注解其他注解,所有的注解都是基于这四种注解来定义的。

 

@Target注解:用于描述注解的使用范围,超出范围时编译失败。

  取值类型(ElementType):

    1.CONSTRUCTOR:用于描述构造器

    2.FIELD:用于描述域(成员变量)

    3.LOCAL_VARIABLE:用于描述局部变量

    4.METHOD:用于描述方法

    5.PACKAGE:用于描述包

    6.PARAMETER:用于描述参数

    7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

例如:

 

[java] view plain copy
 
  1. @Target(ElementType.TYPE)  
  2. public @interface MyAnnotation {  
  3.     //类名注解,默认即为当前类名  
  4.     String name() default "className";  
  5. }  

 

[java] view plain copy
 
  1. import java.lang.annotation.ElementType;  
  2. import java.lang.annotation.Target;  
  3.   
  4. //字段注解  
  5. @Target(ElementType.FIELD)  
  6. public @interface MyAnnotation1 {  
  7.     String name() default "fieldName";            
  8.     String getFieldValue() default "getField";    
  9.     String setFieldValue() default "setField";   
  10. }  

 

 

@Retention:描述注解的生命周期,即注解的生效范围。

  取值范围(RetentionPolicy):

   1.SOURCE:在源文件中生效,仅存在java文件中,class文件将会去除注解。

   2.CLASS:在class文件中生效,仅保留在class文件中,运行时无法获取注解。

   3.RUNTIME:在运行时生效,保留在class文件中且运行时可通过反射机制获取。

例如:

 

[java] view plain copy
 
  1. @Target(ElementType.FIELD) //字段注解  
  2. @Retention(RetentionPolicy.RUNTIME) //在运行期保留注解信息  
  3. public @interface MyAnnotation1 {  
  4.     String name() default "fieldName";            
  5.     String getFieldValue() default "getField";    
  6.     String setFieldValue() default "setField";   
  7. }  

 

 

@Documented:用于指定javac生成API时显示该注解信息。

例如:

 

[java] view plain copy
 
  1. @Target(ElementType.FIELD) //字段注解  
  2. @Retention(RetentionPolicy.RUNTIME) //在运行期保留注解信息  
  3. @Documented     //在生成javac时显示该注解的信息  
  4. public @interface MyAnnotation1 {  
  5.     String name() default "fieldName";            
  6.     String getFieldValue() default "getField";    
  7.     String setFieldValue() default "setField";   
  8. }  

 

 

@Inherited:标明该注解可以由子类继承,及子类可以继承父类的注解。而默认情况下,子类是不继承父类注解的。

例如:

 

[java] view plain copy
 
  1. @Target(ElementType.FIELD) //字段注解  
  2. @Retention(RetentionPolicy.RUNTIME) //在运行期保留注解信息  
  3. @Documented     //在生成javac时显示该注解的信息  
  4. @Inherited      //标明MyAnnotation1注解可以被使用它的子类继承  
  5. public @interface MyAnnotation1 {  
  6.     String name() default "fieldName";            
  7.     String getFieldValue() default "getField";    
  8.     String setFieldValue() default "setField";   
  9.     public enum FieldValue{MYTEST,MYFIELD,MYVALUE};  
  10.     FieldValue  realVale() default FieldValue.MYFIELD;  
  11. }  

 

 

二、读取注解

    通过反射机制我们可以读取注解信息。java在java.lang.reflect包下新增了AnnotatedElement接口,该接口定义了可以接受注解的元素为:Class(类)、Constructor(构造器)、Field(字段)、Method(方法)、Package(包)。

    AnnotatedElement是所有注解元素的父接口,所有的注解元素都可以通过某个类反射获取AnnotatedElement对象,该对象有一下4个方法来访问Annotation信息。

(1)<T extends Annotation> T getAnnotation(Class<T> annotationClass)

     返回该程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。

 

(2)Annotation[] getAnnotations():返回该程序元素上存在的所有注解。


(3)boolean isAnnotationPresent(Class<?extends Annotation> annotationClass)

    判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.


(4)Annotation[] getDeclaredAnnotations()

    返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。

例如:

注解:

 

[java] view plain copy
 
  1. package com.dhcc.iscp.web.annotation;  
  2.   
  3. import java.lang.annotation.ElementType;  
  4. import java.lang.annotation.Retention;  
  5. import java.lang.annotation.RetentionPolicy;  
  6. import java.lang.annotation.Target;  
  7.   
  8. @Target(ElementType.TYPE)  
  9. @Retention(RetentionPolicy.RUNTIME) //在运行期保留注解信息  
  10. public @interface MyAnnotation {  
  11.     //类名注解,默认即为当前类名  
  12.     String name() default "className";  
  13. }  

 

[java] view plain copy
 
  1. package com.dhcc.iscp.web.annotation;  
  2.   
  3. import java.lang.annotation.Documented;  
  4. import java.lang.annotation.ElementType;  
  5. import java.lang.annotation.Inherited;  
  6. import java.lang.annotation.Retention;  
  7. import java.lang.annotation.RetentionPolicy;  
  8. import java.lang.annotation.Target;  
  9.   
  10.   
  11. @Target(ElementType.FIELD) //字段注解  
  12. @Retention(RetentionPolicy.RUNTIME) //在运行期保留注解信息  
  13. @Documented     //在生成javac时显示该注解的信息  
  14. @Inherited      //标明MyAnnotation1注解可以被使用它的子类继承  
  15. public @interface MyAnnotation1 {  
  16.     String name() default "fieldName";            
  17.     String getFieldValue() default "getField";    
  18.     String setFieldValue() default "setField";   
  19.     public enum FieldValue{MYTEST,MYFIELD,MYVALUE};  
  20.     FieldValue  realValue() default FieldValue.MYFIELD;  
  21. }  


实体类:

 

[java] view plain copy
 
  1. package com.dhcc.iscp.web.annotation;  
  2.   
  3. import com.dhcc.iscp.web.annotation.MyAnnotation1.FieldValue;  
  4.   
  5. @MyAnnotation(name="myTest")  
  6. public class MyTest {  
  7.   
  8.     @MyAnnotation1  
  9.     String myTest;  
  10.       
  11.     @MyAnnotation1(name="test",getFieldValue="1",setFieldValue="2",realValue=FieldValue.MYVALUE)  
  12.     String testValue;  
  13.   
  14.     public String getMyTest() {  
  15.         return myTest;  
  16.     }  
  17.   
  18.     public void setMyTest(String myTest) {  
  19.         this.myTest = myTest;  
  20.     }  
  21.   
  22.     public String getTestValue() {  
  23.         return testValue;  
  24.     }  
  25.   
  26.     public void setTestValue(String testValue) {  
  27.         this.testValue = testValue;  
  28.     }  
  29.       
  30. }  

 

 

测试类:

 

[java] view plain copy
 
  1. package com.dhcc.iscp.web.annotation;  
  2.   
  3. import java.lang.annotation.Annotation;  
  4. import java.lang.reflect.Field;  
  5. import java.lang.reflect.Method;  
  6.   
  7. public class TestAnnotation {  
  8.     public static void main(String[] args){  
  9.         MyTest myTest = new MyTest();  
  10.           
  11.         Annotation[] annotations = myTest.getClass().getAnnotations();  //获取类的所有注解  
  12.         for(Annotation anno:annotations){  
  13.             if(anno instanceof MyAnnotation){  
  14.                 MyAnnotation myAnnotation = (MyAnnotation)anno;  
  15.                 System.out.println("className:"+myAnnotation.name());  
  16.             }else if(anno instanceof MyAnnotation1){  
  17.                 MyAnnotation1 myAnnotation1 = (MyAnnotation1)anno;  
  18.                 System.out.println("FiledName:"+myAnnotation1.name());  
  19.                 System.out.println("setFieldValue"+myAnnotation1.setFieldValue());  
  20.                 System.out.println("getFieldValue"+myAnnotation1.getFieldValue());  
  21.                 System.out.println("realValue"+myAnnotation1.realValue());  
  22.             }  
  23.         }  
  24.           
  25.         Field[] fields = myTest.getClass().getDeclaredFields();//获取所有注解字段  
  26.         for(Field field:fields){  
  27.             if(field.isAnnotationPresent(MyAnnotation1.class)){  
  28.                 MyAnnotation1 myAnno = (MyAnnotation1)field.getAnnotation(MyAnnotation1.class);  
  29.                 System.out.println(field.getName()+"-name:"+myAnno.name());  
  30.                 System.out.println(field.getName()+"-getFieldValue:"+myAnno.getFieldValue());  
  31.                 System.out.println(field.getName()+"-setFieldValue:"+myAnno.setFieldValue());  
  32.                 System.out.println(field.getName()+"-realValue:"+myAnno.realValue());  
  33.             }  
  34.         }  
  35.           
  36.         Method[] methods = myTest.getClass().getMethods();//获取所有方法  
  37.         for(Method method:methods){  
  38.             if(method.isAnnotationPresent(MyAnnotation1.class)){  
  39.                 MyAnnotation1 myAnno1 = (MyAnnotation1)method.getAnnotation(MyAnnotation1.class);  
  40.                 System.out.println(myAnno1.getClass());  
  41.             }  
  42.         }  
  43.     }  
  44. }  

 

测试结果:


三、自定义注解

自定义注解是通过@interface来声明的,其中的每一个方法实际上是声明了一个配置参数,参数名称即为方法名,参数类型即为返回值类型。

 

自定义注解的格式:

public @interface 注解名{定义体}

 

注解参数可支持的类型:

  1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)
  2.String类型
  3.Class类型
  4.enum类型
  5.Annotation类型
  6.以上所有类型的数组

 

注解参数的定义规则:

  a.只能使用public或默认2种访问修饰,例如:String getName();这里getName()就是使用了默认访问权限。

  b.参数类型只能使用上面提到的6种情况

  c.如果只有一个参数成员,最好将参数名定义为:value()。

  d.注解元素必须有确定值,要么在定义的时候设置默认值,要么在使用注解的时候设置参数值。

 

分享到:
评论

相关推荐

    spring自定义注解样例

    总结来说,Spring自定义注解和AOP的结合使用,让我们能够灵活地在代码中插入跨切面的关注点,如日志记录、事务管理、性能监控等,而不必在每个方法中手动添加这些代码。这不仅提高了代码的整洁度,也使得系统更加...

    Spring 自定义注解的解析

    总的来说,Spring自定义注解的解析是一个强大且灵活的工具,可以帮助我们实现更精细化的代码组织和控制。结合`@ComponentScan`,我们可以轻松地在Spring环境中管理和利用自定义注解,进一步提升代码的可读性和可维护...

    spring自定义注解+Aspect使用1

    Spring 自定义注解和 Aspect 的使用 在本文中,我们将学习如何在 Spring 项目中使用自定义注解和 Aspect 来实现日志记录功能。我们将从头开始,创建一个简单的 Spring Boot 项目,然后使用自定义注解和 Aspect 来...

    Spring 自定义注解注入properties文件的值jar包

    Spring 自定义注解注入properties文件的值jar包,下面为使用方法 在xml配置文件中,这样加载properties文件 ...

    浅谈Spring自定义注解从入门到精通

    浅谈Spring自定义注解从入门到精通 在业务开发过程中,我们经常会遇到形形色色的注解,但是框架自有的注解并不是总能满足复杂的业务需求。这时,我们可以自定义注解来满足我们的需求。根据注解使用的位置,文章将...

    spring aop 自定义注解保存操作日志到mysql数据库 源码

    3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑...

    spring中自定义注解(annotation)与AOP中获取注解

    在Spring框架中,自定义注解(Annotation)和AOP(面向切面编程)的结合使用,极大地增强了代码的可读性和可维护性。本文将深入探讨如何在Spring中创建自定义注解以及如何在AOP中有效地获取并利用这些注解。 首先,...

    自定义注解得使用,模拟spring通过注解方式创建bean实例

    本篇将深入探讨如何自定义注解并模拟Spring通过注解方式创建bean实例。 首先,了解注解(Annotation)在Java中的角色。注解是一种元数据,它提供了在源代码中添加信息的方式,这些信息可以被编译器或运行时环境读取...

    详解使用Spring AOP和自定义注解进行参数检查

    使用Spring AOP和自定义注解进行参数检查 了解使用Spring AOP和自定义注解进行参数检查的技术细节。通过自定义注解和spring AOP,我们可以实现参数的校验,提高代码的可读性和可维护性。 自定义注解 在本篇文章中...

    使用SpringBoot通过自定义注解+AOP+全局异常处理实现参数统一非空校验源码

    使用SpringBoot通过自定义注解+AOP+全局异常处理实现参数统一非空校验

    spring自定义注解实现拦截器的实现方法

    在Spring框架中,自定义注解结合AOP(面向切面编程)是实现业务逻辑与非业务逻辑分离的一种有效方式。通过自定义注解,可以针对不同的业务场景灵活地添加功能,比如权限控制、日志记录、事务管理等。本文将详细讨论...

    丛林探险之Spring自定义注解加载Bean

    这个机制在实际开发中有着广泛的应用,比如在微服务框架如Dubbo中,通过自定义注解可以方便地将服务提供者和服务消费者自动注册到Spring容器,简化配置,提高代码可读性和可维护性。通过理解和掌握这一机制,开发者...

    Spring java注解,元注解和自定义注解

    ### Spring Java注解、元注解与自定义注解详解 #### 一、Java注解简介 在深入了解Spring框架中的注解应用之前,我们首先需要对Java注解有一个基本的认识。Java注解(Annotation)是一种元数据,可以为程序代码添加...

    Java自定义注解与spring BeanPostProcessor详解

    Java自定义注解和Spring的BeanPostProcessor是Java企业级开发中的两个重要概念,它们在构建灵活、可扩展的应用程序中发挥着关键作用。本文将深入探讨这两个话题,并结合源码分析,帮助开发者更好地理解和应用。 ...

    java 自定义注解验证

    Java 自定义注解验证是Java开发中的一个重要特性,它允许开发者创建自己的元数据,以便在编译时或运行时对代码进行验证和处理。自定义注解为代码提供了额外的信息,使得程序更具可读性、可维护性和灵活性。在本案例...

    java(spring boot)自定义注解

    在这个特定的场景中,我们探讨的是如何在Spring Boot应用中自定义注解,以及如何利用这个注解进行系统监控的开发。 首先,让我们理解什么是自定义注解。在Java中,注解(Annotation)是一种元数据,它提供了向...

    使用Java自定义注解模拟实现SpringBoot相关注解.zip

    本教程将探讨如何使用Java自定义注解来模拟实现这些SpringBoot相关的注解功能。 首先,我们来看`@Autowired`注解。`@Autowired`是Spring框架中的一个关键注解,用于自动装配bean。当我们想在类中注入某个依赖时,而...

    自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏

    自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回...

    自定义注解实现伪动态传参的小demo

    在这个“自定义注解实现伪动态传参的小demo”中,我们将探讨如何创建一个自定义注解,以允许在注解中传递类似于动态参数的数据。 首先,自定义注解的定义通常以`@interface`关键字开始,我们可以定义一些元素(也...

    实现生成自定义注解的实体类

    在服务端开发中,如Spring框架,自定义注解可以用于简化配置,增强功能。例如,可以创建一个用于事务管理的注解: ```java @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @...

Global site tag (gtag.js) - Google Analytics