本文将介绍Controller层的相关注解,带着介绍一些有联系的注解
@Component
注解的作用很简单,直接在类上使用,就是把这个类注入到Spring容器中,且默认的Bean
名称为类名的首字母小写。也可以在使用该注解的时候指定Bean
的名称。
@Controller
、@Service
、@Repository
这三个注解本质上都是@Component
只不过用来标识不同的分层而已.
@Controller
标识的类,该类代表控制器类(控制层/表现层)
@Service
标识的类,该类代表业务逻辑层
@Repository
标识的类,该类代表Dao层/持久层
可以看下 @Controller
的源码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
@AliasFor(
annotation = Component.class
)
String value() default "";
}
@ResponseBody
作用于Controller的方法上,它的作用是将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端。
当方法上面没有写@ResponseBody
时,底层会将方法的返回值封装为ModelAndView对象。
加了@ResponseBody
后,如果返回值是字符串,那么直接将字符串返回;如果是一个对象,会将对象转化为json串返回。
@RestController
本质上是@Controller
与@ResponseBody
的组合,明白了这两个注解的作用,自然就理解了它的作用。我们可以看一下@RestController
的源码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
@AliasFor(
annotation = Controller.class
)
String value() default "";
}
@RequestMapping
注解是一个用来处理请求地址映射的注解,可用于映射一个请求,可以用在类或方法上。
用于类上时,表示类中的所有响应请求的方法都是以该地址作为父路径
用于方法上,表示在类的父路径下追加方法注解中的地址将会访问到该方法
先看一下源码,有哪些属性(这些属性的设置是用来匹配请求的,不是用来设置请求的)
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
@RequestMapping
的 value
属性必须设值;@RequestMapping
的 value
属性是用来指定当前请求的请求地址@RequestMapping
的method
属性用来指定当前方法的请求方式@RequestMapping
可以设置多种请求方式@RequestMapping
默认支持所有请求方式@RequestMapping
的params
属性用来设置当前请求的请求参数;@RequestMapping
的params
属性是一个字符串类型的数组,可以通过下面四种表达是来设置匹配关系“param”
:要求请求映射的请求必须为包含 param的请求参数“!param”
:要求请求映射的请求是不能包含param的请求参数“param=value”
:要求请求映射的请求必须包含 param 的请求参数,且 param 参数的值必须为 value “param!=value”
: 要求请求映射的请求是必须包含 param 的请求参数,其值不能为 value。@RequestMapping
的headers
属性用来设置当前请求的请求头信息;@RequestMapping
的headers
属性是一个字符串类型的数组,可以通过下面四种表达是来设置匹配关系“header”
:要求请求映射的请求必须为包含 header的请求头信息“!header”
:要求请求映射的请求必须为不包含 header的请求头信息“header=value”
:要求请求映射的请求必须为包含 header的请求头信息,并且header的值必须为value“header!=value”
:要求请求映射的请求必须为包含 header的请求头信息,并且header的值必须不是value实际项目中,我们使用的最多的还是@GetMapping
与@PostMapping
注解,这两个注解本质上是指定了请求方式的@RequestMapping
注解,不过更加直观,所以实际使用场景较多。我们可以看一下@GetMapping
的源码
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(
method = {RequestMethod.GET}
)
public @interface GetMapping {
@AliasFor(
annotation = RequestMapping.class
)
String name() default "";
@AliasFor(
annotation = RequestMapping.class
)
String[] value() default {};
@AliasFor(
annotation = RequestMapping.class
)
String[] path() default {};
@AliasFor(
annotation = RequestMapping.class
)
String[] params() default {};
@AliasFor(
annotation = RequestMapping.class
)
String[] headers() default {};
@AliasFor(
annotation = RequestMapping.class
)
String[] consumes() default {};
@AliasFor(
annotation = RequestMapping.class
)
String[] produces() default {};
}