Spring MVC是Spring中的一个重要模块。作为开源的Java EE应用框架,很多Web应用都是由Spring来支撑的。在Web应用中,MVC的模式使用已经广为人知。Spring MVC由于其简单,易用的特点已经广泛用在Java web开发领域中,其易用的特性有很大成分由于其提供了很多拿来就用的注解,这里我们就对常用的一些注解做一些整理,供参考
注解
@RequestBody
简单说,@ResponseBody注解将HttpRequest的请求体映射为Java的POJO对象。一般Get方法是没有body的,在post数据的时候可以指定json数据。注意:对于想要转换的格式,记得要添加对应的依赖包。比如json的,添加Gson。或者jackson,必要时还要配置一下converter的bean。
@RequestBody注解主要用来处理请求中body的部分
不添加RequestBody
添加@RequestBody
@ResponseBody
这个注解可以放在方法上用来指示这个方法,返回的值直接写到Http的响应体中,不需要替换为Spring的Model或者解析为视图。
用于标识当前方法返回的值不被视图解析。
@Autowired
这个注解可以用于属性,setter方法,还有构造器上,这个注解用于注入依赖的对象。当你再一个属性上加上@Autowired注解,有时可能要指定一些额外的值,Spring然后会自动的将值赋给这个属性。
@Qualifier
这个注解通常和@Autowired一起使用,当你想对注入的过程做更多的控制,@Qualifier可以帮助你指定做更详细配置。一般在两个或者多个bean是相同的类型,spring在注入的时候会出现混乱。
比如:有个接口叫做HelloInterface
,然后有两个bean都实现了HelloInterface接口。
@Component
public class Bean1 implements HelloInterface {
//
}
@Component
public class Bean2 implements HelloInterface {
//
}
如果我们只使用@Autowired注解,Spring就不知道到底要注入哪一个bean。解决办法就是加上@Qualifier注解
@Component
public class BeanA {
@Autowired
@Qualifier("bean2")
private HelloInterface dependency;
@Configuration
这个注解一般用在类上面,加上@Configuration的类可以想象为一个spring的xml配置文件,只不过这次是使用基于java 代码的配置。
主要用来标记当前类是Spring的配置类,基于Java的配置
@Controller,@Service,@Component,@Repository
在spring源码包中,这四个注解的定义
// Component注解定义
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Component {
String value() default "";
}
// Repository注解定义
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {
String value() default "";
}
// Service注解定义
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
String value() default "";
}
// Controller注解定义
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
String value() default "";
}
可以看到,四个注解都可以说成事Component级别的注解,Spring框架自动扫描的注解也是检测是否有Component注解标记。
@Component这个注解主要用于标记一个类作为spring的组件,spring扫描的时候扫描的是这个注解。
标记@Component的类在spring的beanName中是类首字母小写,其余字母都一样。
因为其它几个常用典型注解也是Component,所以他们与Component有相同的beanName命名方式。
@Repository这个注解用来标识这个类是用来直接访问数据库的,这个注解还有一个特点是“自动转换(automatic translation)”。就是在标记 @Repositor发生异常的时候,会有一个处理器来处理异常,而不需要手动的再加try-catch块。
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
@Service注解应用的业务逻辑通常在service层实现,因为我们一般使用@Service注解标记这个类属于业务逻辑层。
@Controller注解 这个注解主要告诉Spring这个类作为控制器,可以看做标记为暴露给前端的入口
@Component spring基础的注解,被spring管理的组件或bean
@Repository 用于持久层,数据库访问层
@Service 用于服务层,处理业务逻辑
@Controller 用于呈现层,(spring-mvc)
@ExceptionHandler
单独使用@ExceptionHandler时一般写在控制器的内部,在控制器的某个方法上加上@ExceptionHandler注解。
在ExceptionController内部如果抛出了CustomException异常,就会被这个控制器内部的handleError捕捉到。然后进行处理
@Controller
public class ExceptionController {
@ExceptionHandler({CustomException.class})
public String handleError(Exception e){
// ...
// 处理异常
return e.getMessage();
}
}
缺点:
只能作用在特定的控制器,如果每个控制器都添加@ExceptionHandler注解的话,效率太低了。
或者写一个基类的控制器上添加@ExceptionHandler注解,但有时一些控制器已经继承其它的类了,那么还是不够方便。
@ControllerAdvice
Spring 3.2之后加入了新的@ControllerAdvice注解,可以支持全局的异常处理。这样我们就不用将@ExceptionHandler写的到处都是,只需要集中在一个控制器就可以。
@ControllerAdvice
public class ExceptionController {
@ExceptionHandler({CustomException.class})
public String handleError(Exception e){
// ...
// 处理异常
return e.getMessage();
}
@ExceptionHandler(Exception.class)
public ResponseEntity<Object> handleAllException(Exception e){
// 处理异常
// do something
return ResponseEntity.ok(...);
}
}
这种处理方式实际上十分灵活,我们可以根据需要返回自己的类型:
- 返回普通对象
- 返回ResposeEntity的响应
@ModelAttribute
@ModelAttribute也是Spring MVC中非常重要的注解之一,它主要绑定方法的参数或者方法的返回值为一个 命名属性 ,并且暴露给view使用
@SessionAttributes
@SessionAttributes用于在会话中存储Model的属性,一般作用在类的级别。像下面的代码,model的属性user会被存储到session中,因为@ModelAttribute与@SessionAttributes有相同的注解。
@Controller
@SessionAttributes("user")
public class ModelController {
@ModelAttribute("user")
public User initUser(){
User user = new User();
user.setName("default");
return user;
}
}
@SessionAttribute
@SessionAttribute是用于获取已经存储的session数据,并且作用在方法的层面上
@RequestMapping("/session")
public String session(
@SessionAttribute("user") User user
){
// do something
return "index";
}
结束
常用在开发过程中的注解,本次我们都提及了一遍,可以做一些简单的开发参考,希望能帮助到大家。
注:
本文独家发布自金蝶云社区