Spring MVC注解参考
金蝶云社区-艾贺521
艾贺521
19人赞赏了该文章 723次浏览 未经作者许可,禁止转载编辑于2018年11月17日 10:07:09
封面

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

image.png


添加@RequestBody

image.png



@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";

    }



结束

常用在开发过程中的注解,本次我们都提及了一遍,可以做一些简单的开发参考,希望能帮助到大家。


注:

本文独家发布自金蝶云社区


赞 19