JavaEE中一些不大常用,但是具有特色功能的注解【持续整理】

原创
2019/04/09 14:00
阅读数 107

什么是注解


注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,就去干相应的事,标记可以加在包、类,属性、方法,方法的参数以及局部变量上。

注解的简单应用

注解类

@interface A {

}

应用注解类

@A
class B {

	@A
	String field;

	@A
	void method(){

	}
}

小结

注解可以加在类、成员变量、成员方法上。

注解是JDK1.5之后才提供的特性,三个常见注解:

  • @Deprecated 意思是“废弃的,过时的”
  • @Override 意思是“重写、覆盖”
  • @SuppressWarnings 意思是“压缩警告”

元注解


首先解释一下什么是元注解,元注解就是注解注解的注解。

说起来有点拗口,可以这样理解,看下面的例子:

/**
 * 这是一个自定义的注解(Annotation)类 在定义注解(Annotation)类时使用了另一个注解类Retention
 * 在注解类上使用另一个注解类,那么被使用的注解类就称为元注解
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface MyAnnotation {
}

这是我们自定义的注解MyAnnotation,在我们自定义的注解注解类中,我们使用了这两个注解@Retention@Target,这两个注解就是元注解——注解(动词)注解(注解类)的注解(名词)。

J2SE5.0版本在 java.lang.annotation提供了四种元注解,专门注解其他的注解:

  • @Documented –注解是否将包含在JavaDoc中
  • @Retention –什么时候使用该注解
  • @Target? –注解用于什么地方
  • @Inherited – 是否允许子类继承该注解

@Documented元注解

@Retention元注解

首先看一下带有注解的Java的执行过程,分为下面三个阶段

  1. Java源程序上加了一个注解
  2. Java源程序要由javac去编译,把源文件编译成.class文件
  3. 运行编译好的class文件 这三个阶段就是Java-->class-->字节码的过程

这个@Retention元注解就是表示注解的生命周期的,他有三个属性值

  • RetentionPolicy.SOURCE阶段(java源文件阶段)
  • RetentionPolicy.CLASS阶段(class文件阶段)
  • RetentionPolicy.RUNTIME阶段(内存中的字节码运行时阶段)

@Target元注解

@Target元注解决定了一个注解可以标识到哪些成分上,如标识在在类身上,或者属性身上,或者方法身上等成分,@Target默认值为任何元素

@Inherited元注解


javax下的注解

@PostConstruct

用来修饰一个非静态的void()方法.而且这个方法不能有抛出异常声明。

被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。

@PreDestroy

用来修饰一个非静态的void()方法.而且这个方法不能有抛出异常声明。

被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。

@WebListener

该注解用于监听器

监听器类应该实现下面接口之一:

  1. 对Request的监听有ServletRequestListener和ServletRequestAttributeListener。

    • 前者可见监听Request的创建和销毁;
    • 而后者可以对Request的属性进行监听。
  2. 对Session的监听有HttpSessionListener和HttpSessionAttributeListener。

    • 前者可以监听HttpSession的创建跟销毁,
    • 后者则是对session中属性的监听。
  3. 对于ServletContext的监听器有ServletContextListener和ServletContextAttributeListener。

    • 前者可以监听到ServletContext的创建和销毁,
    • 后者可以监听到ServletContext中属性的监听。

@MappedSuperclass

JPA环境下中使用

  1. @MappedSuperclass注解用在实体类的父类上
  2. @MappedSuperclass标识的类表示其不能映射到数据库表,因为其不是一个完整的实体类,但是它所拥有的属性能够让继承其的子类映射到数据库表中
  3. @MappedSuperclass标识得类不能再有@Entity或@Table注解

@Inheritance

注解标注在父类上不会被子类所继承 我也仅仅是会用,说的不是太明白


Spring提供的注解

@Component

  • spring作用在类上的注解有@Component@Responsity@Service以及@Controller
  • 当注解作用在类上时,表明这些类是交给spring容器进行管理的,而用@Autowired@Resource引入该类对象时,并不需要我自己去new一个,spring容器会自动的将我需要对象创造出来。这就是通常所说的依赖注入和控制反转。

泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。一般公共的方法我会用上这个注解

@EnableScheduling和@Scheduled

@Scheduled注解是Spring提供的定时任务调度的注解,该注解注解在方法上,可定义cron表达式定时执行,也可自定义延时时间执行

在使用@Scheduled注解的时候,要确保已经开启Spring此功能,开启此功能只需要将@EnableScheduling注解到启动类上即可

@NoRepositoryBean

在使用spring data jpa的时候,每个实体类有需要实现的相同的方法,就可以单独抽取出来,放在一个公共的接口MyRepository中,并这个类继承了jpa的相关Repository接口或类,由MyRepository接口来衔接jpa的相关操作,其他实体类需要实现的操作就直接继承MyRepository接口,不用每次都去继承jpa的相关接口或类啦,所以这个公共接口就需要这个注解@NoRepositoryBean来标识。

@Repository

Dao层的注解,如果继承了相关的Repository或者配置了bean写不写都可以

@EnableWebSocketMessageBroker

@EnableWebSocketMessageBroker注解用于开启使用STOMP协议来传输基于代理(MessageBroker)的消息,这时候控制器(controller)开始支持@MessageMapping,就像是使用@requestMapping一样。

@EnableJms

注解@EnableJms设置在@Configuration类上,用来声明对 JMS 注解的支持。

@EnableAsyncx

注解在配置类上, 开始异步任务支持

@Async

注解在类或者方法上, 来声明一个异步任务

@Order

定义Spring容器加载Bean的顺序

@ServerEndpoint

websocket的@RequestMapping


Swagger提供的注解

@EnableSwagger2

@Api

用于类;表示标识这个类是swagger的资源

  • [tags] – 表示说明
  • [value] – 也是说明,可以使用tags替代 但是tags如果有多个值,会生成多个list

@ApiOperation()

用于方法;表示一个http请求的操作

  • [value] - 用于方法描述
  • [notes] - 用于提示内容
  • [tags] - 可以重新分组(视情况而用)

@ApiParam()

用于方法,参数,字段说明;表示对参数的添加元数据(说明或是否必填等)

  • [name] – 参数名
  • [value] – 参数说明
  • [required] – 是否必填

@ApiModel()

用于类 ;表示对类进行说明,用于参数用实体类接收

  • [value] – 表示对象名
  • [description] – 描述

都可省略

@ApiModelProperty()

用于方法,字段; 表示对model属性的说明或者数据操作更改

  • [value] – 字段说明
  • [name] – 重写属性名字
  • [dataType] – 重写属性类型
  • [required] – 是否必填
  • [example] – 举例说明
  • [hidden] – 隐藏

@ApiIgnore()

用于类或者方法上,可以不被swagger显示在页面上

@ApiImplicitParam()

用于方法 表示单独的请求参数

@ApiImplicitParams()

用于方法,包含多个 @ApiImplicitParam

  • [name] – 参数ming
  • [value] – 参数说明
  • [dataType] – 数据类型
  • [paramType] – 参数类型
  • [example] – 举例说明
展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部