什么是注解
注解(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的执行过程,分为下面三个阶段
- Java源程序上加了一个注解
- Java源程序要由javac去编译,把源文件编译成.class文件
- 运行编译好的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
该注解用于监听器
监听器类应该实现下面接口之一:
-
对Request的监听有ServletRequestListener和ServletRequestAttributeListener。
- 前者可见监听Request的创建和销毁;
- 而后者可以对Request的属性进行监听。
-
对Session的监听有HttpSessionListener和HttpSessionAttributeListener。
- 前者可以监听HttpSession的创建跟销毁,
- 后者则是对session中属性的监听。
-
对于ServletContext的监听器有ServletContextListener和ServletContextAttributeListener。
- 前者可以监听到ServletContext的创建和销毁,
- 后者可以监听到ServletContext中属性的监听。
@MappedSuperclass
JPA环境下中使用
@MappedSuperclass
注解用在实体类的父类上@MappedSuperclass
标识的类表示其不能映射到数据库表,因为其不是一个完整的实体类,但是它所拥有的属性能够让继承其的子类映射到数据库表中@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] – 举例说明
来源:oschina
链接:https://my.oschina.net/u/2424003/blog/3034037