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() + "\n"); } else if (field.isAnnotationPresent(FruitColor.class)) { FruitColor annotation = field.getAnnotation(FruitColor.class); System.out.println(annotation.fruitColor().toString() + "\n"); } 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

猜你喜欢

转载自www.cnblogs.com/guanbin-529/p/8980284.html