由于项目使用了spring boot,所以经常需要使用spring的一些注解来简化代码和配置,以下罗列一些平时工作中使用的注解
@Autowired
此注解的作用是把对应的服务类根据类型byType注入到Spring容器中
@Resource
此注解并不是spring的,而是j2ee的,但是spring也支持此注解,这个注解注入的方式和@Autowired不一样的地方是这个是根据名称byName来实现的
@RequestMapping
根据Spring MVC架构,需要把对应的http请求映射到对应的控制器上,这时候就需要用到这个注解了,
主要作用是配置url映射,当控制器在类级别上添加@RequestMapping注解时,这个注解会应用到控制器的所有处理器方法上。处理器方法上的@RequestMapping注解会对类级别上的@RequestMapping的声明进行补充。
@Controller @Controller 用来响应页面,必须配合模版来使用
@RestController @RestController是@ResponseBody和@Controller的组合注解。
@RolesAllowed 表示访问对应方法时所应该具有的角色,使用前需要导入Jsr-250-api依赖,开启注解
@Async 作用在方法上,表示此方法和方法的调用者之间是异步的,即调用此方法的方法不需要等这个方法执行完毕再执行之后的代码
@ApiOperation 这个注解并不是Spring的,它是swagger里的注解,但是这个注解配合Spring可以很好的解决一个问题,就是用来构建API接口文档的,具体的使用方式是@ApiOperation(value = “接口说明”, httpMethod = “接口请求方式”, response = “接口返回参数类型”, notes = “接口发布说明”;)等
@Deprecated 这个也是jdk自带的注解,主要作用就是表明这个方法或者类已经废弃,
@Around
@Bean
@Before
@After
注解的实现原理
首先我们需要了解Java为我们提供的元注解和相关定义注解的语法,举例如下@Target({ElementType.METHOD})
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Demo {
boolean value()default true;
}
注解的实现都是使用@interface 类似于我们的class 和interface
jdk定义了四个使用在注解上的注解来实现其他定义的注解,你可以把这四个注解理解为基础注解,不需要你考虑,jdk定义的四个注解分别为1.@Target, 2.@Retention, 3.@Documented, 4.@Inherited
1: @Target
作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
取值(ElementType)有:
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
比如我们上面举的例子demo中就是表示demo注解可以使用在方法上
2:@Retention
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
一般而言,我们的注解都是使用RUNTIME运行时有效
3:@Document
用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
注解是根据Spring的aop原理来实现的,aop的原理又是基于java的动态代理和cglib(基于字节码)的包来实现
一般定义完一个注解后,需要实现注解的功能,就需要新增一个类专门去实现这个注解的功能了
类名一般和注解名一样,也可以在注解名后面写上Aspect
定义好类之后,怎么把注解和对应的类进行关联呢,我们就需要定义一个切点方法(因为我们知道注解本身就是基于Spring的aop原理来实现的)
所以先定义好一个切点方法
public void point(){
},在这个方法上使用spring自带的切点注解来和实现类和注解的关联
@Point("@annotation(com.xidian.haitang.annotations.Demo)")
public void point(){
}
这样我们就可以利用spring的aop原理和自带的注解来实现具体功能了,例如
@Before("point")
@After("point")
@Around("point()")
这样就是一个自定义的注解了。
网友评论