Controller类上的注解有以下四个
- @Controller:是@Component的一种,@Controller代表MVC中的C,表示控制层
- @RestController: @Responsebody和@Controller的组合注解,相当于给类下的所有handler方法上添加@Responsebody注解,此时视图解析器,过滤器不在适用。
- @ControllerAdivce:相当于给所有@Controller标注的类上添加切面。等价于execution(* @Controller *.*(..))表达式,
- @RestControllerAdvice:相当于给所有@RestController标注的类上添加切面
1、@Controller
@Controller与其他@Component,@Service功能相同,是给IOC容器中注入bean。区别在于@Controller表示Controller类。示例略。
2、@RestController
@RestController是@Responsebody和@Controller的组合注解。相当于给类下Handler方法上添加@Responsebody注解,方法返回值为response输出流的内容。
在使用时需要注意:
- 此时不适用视图解析器,视图解析器的作用是将viewname 转换为View对象,此时返回的字符串含义不是viewName,而是输出流的内容
- 输出流内容是有大小的,当超出最大值时,response对象会提交。
- 当响应类型为输出流时,不会在执行过滤链
3、@ControllerAdvice
相当于给@Controller类配置切面,切面的意义就是把所有@Controller类中公共的一些方法与@Controller类中的handler方法解耦。
@ControllerAdvice类下的方法是Controller的”公共模块”,例如异常处理,initDataBinder,ModelAttribute等。
@ControllerAdvice可以自定义切面的范围。默认情况下是有@Controller的类。自定义的方式有三种
1、annotations:根据类上的注解定义切面的范围,例如
@ControllerAdvice(annotations = Controller.class)
2、value:根据包名,例如
@ControllerAdvice(basePackages = "controller")
3、assignableTypes:根据类名,例如
@ControllerAdvice(assignableTypes = {TestController.class,HelloController.class})
4、@RestControllerAdvice
与@ControllerAdvice基本相同,区别在于@ControllerAdvice是给@Controller注解配置切面,@RestControllerAdivce是给@RestController配置切面