• Spring注解之-自定义注解


    1.自定义注解,先自定义三个水果属性的注解

    元注解:

    java.lang.annotation提供了四种元注解,专门注解其他的注解(在自定义注解的时候,需要使用到元注解):
       @Documented –注解是否将包含在JavaDoc中
       @Retention –什么时候使用该注解
       @Target –注解用于什么地方
       @Inherited – 是否允许子类继承该注解

      1.)@Retention– 定义该注解的生命周期
      ●   RetentionPolicy.SOURCE : 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。
      ●   RetentionPolicy.CLASS : 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式
      ●   RetentionPolicy.RUNTIME : 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。

      2.)Target – 表示该注解用于什么地方。默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括
      ● ElementType.CONSTRUCTOR:用于描述构造器
      ● ElementType.FIELD:成员变量、对象、属性(包括enum实例)
      ● ElementType.LOCAL_VARIABLE:用于描述局部变量
      ● ElementType.METHOD:用于描述方法
      ● ElementType.PACKAGE:用于描述包
      ● ElementType.PARAMETER:用于描述参数
      ● ElementType.TYPE:用于描述类、接口(包括注解类型) 或enum声明

     3.)@Documented–一个简单的Annotations标记注解,表示是否将注解信息添加在java文档中。

     4.)@Inherited – 定义该注释和子类的关系
         @Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类

    //定义水果颜色注解
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface FruitColor {
    
        /**
         * 颜色枚举
         */
        public enum Color {BULE,RED,GREEN};
    
        //默认值是GREEN
        Color fruitColor() default Color.GREEN;
    
    
    }
    
    //定义水果名字注解
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface FruitName {
    
        //若注解属性是单个,默认命名为value,“”和-1都代表没有值
        String value() default "";
    }
    
    //定义说果供应商注解
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface FruitProvider {
         int id() default -1;
    
         String name() default "";
    
         String address() default "";
    
    }

    2 .使用注解

     1 public class Fruit {
     2 
     3     @FruitName(value = "Apple")
     4     private String fruitName;
     5 
     6     @FruitColor
     7     private String fruitColor;
     8 
     9     @FruitProvider(id=1,name = "陕西红富士",address = "陕西延安")
    10     private String fruitProvider;
    11 
    12 
    13     public String getFruitName() {
    14         return fruitName;
    15     }
    16 
    17     public void setFruitName(String fruitName) {
    18         this.fruitName = fruitName;
    19     }
    20 
    21     public String getFruitColor() {
    22         return fruitColor;
    23     }
    24 
    25     public void setFruitColor(String fruitColor) {
    26         this.fruitColor = fruitColor;
    27     }
    28 
    29     public String getFruitProvider() {
    30         return fruitProvider;
    31     }
    32 
    33     public void setFruitProvider(String fruitProvider) {
    34         this.fruitProvider = fruitProvider;
    35     }
    36 }

    3.解析注解

    @RunWith(SpringRunner.class)
    @SpringBootConfiguration
    @SpringBootTest(classes = Application.class)
    public class FruitTest {
    
        public static void main(String[] args) {
            AnnotationUtil.getFruitInfo(Fruit.class);
        }
    }
    
    
    
    /**
     * @author GuanBin
     * @version AnnotationUtil.java, v1 2018/4/23 下午11:54 GuanBin Exp $$
     */
    public class AnnotationUtil {
        public static void getFruitInfo(Class<?> clazz) {
    
            //获取一个类中的属性
            Field[] fields = clazz.getDeclaredFields();
    
            for (Field field : fields) {
    if (field.isAnnotationPresent(FruitName.class)) { FruitName annotation = field.getAnnotation(FruitName.class); System.out.println("水果名称" + annotation.value() + " "); } else if (field.isAnnotationPresent(FruitColor.class)) { FruitColor annotation = field.getAnnotation(FruitColor.class); System.out.println(annotation.fruitColor().toString() + " "); } else if (field.isAnnotationPresent(FruitProvider.class)) { FruitProvider annotation = field.getAnnotation(FruitProvider.class); System.out .println("供货商id是" + annotation.id() + " 名称是" + annotation.name() + "地址是:" + annotation.address()); } } } }

     参考:

    https://www.cnblogs.com/acm-bingzi/p/javaAnnotation.html

    作者:guanbin —— 纵码万里千山

    出处:https://www.cnblogs.com/guanbin-529/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Form组件
    LAMP+Varnish的实现
    缓存反向代理-Varnish
    CDN初识
    HTTP缓存初探
    Keepalived搭建主从架构、主主架构实例
    实现高可用-Keepalived
    nginx负载均衡实例
    lvs集群实现lvs-dr模型和lvs-nat模型
    LVS介绍
  • 原文地址:https://www.cnblogs.com/guanbin-529/p/8980284.html
Copyright © 2020-2023  润新知