注解

作者: chrisghb | 来源:发表于2019-12-26 16:21 被阅读0次

    注解是放在Java源码的类、方法、字段、参数前的一种特殊“注释”。
    JVM的角度看,注解本身对代码逻辑没有任何影响,如何使用注解完全由工具决定。
    RUNTIME类型的注解是在程序运行期能够读取的注解,它们在加载后一直存在于JVM中,这也是最常用的注解。

    • 注解的四大作用:
      1、生成文档,通过代码里标识的元数据生成javadoc文档。
      2、编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。
      3、编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。
      4、运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。
    • 定义注解
      定义一个注解时,还可以定义配置参数。配置参数必须是常量。如果只写注解,相当于全部使用默认值。

    @Target:注解的作用目标

    @Target(ElementType.TYPE)——接口、类、枚举、注解
    @Target(ElementType.FIELD)——字段、枚举的常量
    @Target(ElementType.METHOD)——方法
    @Target(ElementType.PARAMETER)——方法参数
    @Target(ElementType.CONSTRUCTOR) ——构造函数
    @Target(ElementType.LOCAL_VARIABLE)——局部变量
    @Target(ElementType.ANNOTATION_TYPE)——注解
    @Target(ElementType.PACKAGE)——包

    @Retention:注解的保留位置

    RetentionPolicy.SOURCE:这种类型的Annotations只在源代码级别保留,编译时就会被忽略,在class字节码文件中不包含。
    RetentionPolicy.CLASS:这种类型的Annotations编译时被保留,默认的保留策略,在class文件中存在,但JVM将会忽略,运行时无法获得。
    RetentionPolicy.RUNTIME:这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用。

    @Document:说明该注解将被包含在javadoc中

    @Inherited:说明子类可以继承父类中的该注解

    Java使用@interface来自定义注解。应当设置@Retention(RetentionPolicy.RUNTIME)便于运行期读取该Annotation

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Report {
        int type() default 0;
        String level() default "info";
        String value() default "";
    }
    

    Java提供的使用反射API读取Annotation的方法

    判断某个注解是否存在
    Class.isAnnotationPresent(Class);
    使用反射API读取Annotation
    Class.getAnnotation(Auth.class);
    注意:一般如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Auth {
    Stirng[] userCode();
    }
    
    • 使用注解:
      在方法上加上注解@Auth(userCode="123")
      1.所做的操作都是先通过反射获取对应元素
      Class cls = Auth.class;
      2.再获取元素上面的注解
      HandlerMethod handlerMethod = (HandlerMethod) handler;
      Method method = handlerMethod.getMethod();
      Auth annotation = method.getAnnotation(cls);
      3.最后得到注解的属性值
      String[] aa = annotation.userCode();

    • 常用注解

    controller层

    @Controller
    用于标注控制层
    @Autowired
    自动装配,其作用是消除Java代码里面的getter/setterbean属性中的property
    @ApiOperation(notes="add",value="新增")
    生成swagger
    @RequestMapping(value,method,consumes,produces,params,headers)
    用来处理请求地址映射的注解
    @PostMapping(value="/Major/Info")
    Spring MVC里面提供的Resultful风格的支持
    @GetMapping(value="")
    @PutMapping(value="")
    @DeleteMapping(value="")
    @Auth(desc="新增",userCode="",groupCode="")
    @RequestBody
    用来接收页面传递给后台的json字符串中数据。
    注意:Get方法无请求体,所以使用@RequestBody接收数据时,前端不能使用Get方式提交数据,而应该使用Post方式提交。
    使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如jsonxml等)使用。
    @RequestParam
    获取前端参数
    @Valid
    验证注解是否符合要求
    @ResponseBody
    作用于方法,表明此方法的返回值写入Http response body

    Serveice层

    @Service
    用于标注服务层,主要用来进行业务的逻辑处理
    @Autowired
    自动装配
    @Override
    加在覆写的方法前面,用来检查方法的正确性
    @Transactional(rollbackFor=Exception.class)
    参数有name,propagation,isolation,timeout,read-only,rollback-for,no-rollback-for

    dao层

    @repository
    用于标注数据访问层
    @Mapper
    声明此接口为一个mapper,使用此注解无需再写xml映射文件
    @Param("reqid") String reqid
    传递参数

    entity

    @Data
    注解在类上,为类提供读写属性
    @EqulasAndHashCode(callSuper=false)
    生成equals()hashCode()方法
    @Accessors(chain=true)
    用来配置lombok如何产生和显示getterssetters的方法。
    chain默认false,如果为真,产生的setter返回的是this而不是void
    @TableName("CustomerTable")
    @TableId(value="",type=)
    声明此属性为主键
    @TableField(value="", updateStrategy= FieldStrategy.IGNORED)
    FieldStrategy字段验证策略
    1.ignored 所有的字段都会设置到sql语句中
    2.not_null 默认策略,忽略null的字段,但不忽略""
    3.not-empty 忽略null和空串,即设置值为null或""不会设置到sql

    dto

    @JsonProperty
    @ApoModelProperty
    @Size
    @NotEmpty
    @NotBlank
    @NotNull

    common

    @ConfigrationProperties

    其他

    @Component
    把普通pojo实例化到spring容器中,相当于配置文件中的
    <bean id="" class=""/>
    泛指各种组件,就是说当我们的类不属于各种归类的时候
    (不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类

    @Scope("prototype")
    定义Bean的作用域和生命过程
    值有:singleton,prototype,session,request,session,globalSession

    注解分为两类:

    1、一类是注册Bean
    @Component , @Repository , @ Controller , @Service , @Configration这些注解都是把你要实例化的对象转化成一个Bean,放在IoC容器中。
    2、一类是使用Bean
    即是把已经在xml文件中配置好的Bean拿来用,完成属性、方法的组装。
    比如@Autowired , @Resource,可以通过byTYPE(@Autowired)、byNAME(@Resource)的方式获取Bean
    注意:@Autowired , @Resource可以获取接口类型,不能获取抽象类类型
    spring中autowired和resource注解的区别

    • Spring中Bean的概念
      Spring 中,构成应用程序主干并由Spring IoC容器管理的对象称为bean
      bean是一个由Spring IoC容器实例化、组装和管理的对象。

    @NoArgsConstructor

    注解在类上,为类提供一个无参的构造方法。

    // 使用注解
    @NoArgsConstructor
    public class Shape {
        private int x;
        @NonNull
        private double y;
        @NonNull
        private String name;
    }
     
    // 不使用注解
    public class Shape {
        private int x;
        private double y;
        private String name;
     
        public Shape(){
        }
    }
    

    @AllArgsConstructor

    (1)注解在类上,为类提供一个全参的构造方法。
    (2)默认生成的方法是 public 的,如果要修改方法修饰符可以设置 AccessLevel 的值。

    // 使用注解
    @AllArgsConstructor(access = AccessLevel.PROTECTED)
    public class Shape {
        private int x;
        @NonNull
        private double y;
        @NonNull
        private String name;
    }
     
    // 不使用注解
    public class Shape {
        private int x;
        private double y;
        private String name;
     
        protected Shape(int x, double y, String name){
            this.x = x;
            this.y = y;
            this.name = name;
        }
    }
    

    相关文章

      网友评论

          本文标题:注解

          本文链接:https://www.haomeiwen.com/subject/dakcoctx.html