Spring常用注解详解(二)

发布时间:2023年12月20日

1、@ExceptionHandler:

此注解是 Spring Framework 中用于处理异常的注解。它可以用在方法上,用于指定特定异常类的处理方法。当控制器中抛出指定类型的异常时,Spring 将调用对应的 @ExceptionHandler 注解标注的方法来处理异常。

基本用法:

@Controller
@RequestMapping("/example")
public class ExampleController {

    @GetMapping("/error")
    public String throwError() {
        // 抛出异常,触发异常处理方法
        throw new CustomException("This is a custom exception.");
    }

    @ExceptionHandler(CustomException.class)
    public ModelAndView handleCustomException(CustomException ex) {
        // 处理 CustomException 异常
        ModelAndView modelAndView = new ModelAndView("error");
        modelAndView.addObject("errorMessage", ex.getMessage());
        return modelAndView;
    }
}

在上述例子中,@ExceptionHandler 注解被用于标注 handleCustomException 方法,表示该方法用于处理 CustomException 异常。当 throwError 方法中抛出 CustomException 异常时,Spring 将调用 handleCustomException 方法来处理异常,并返回一个包含错误信息的视图。

多个异常的处理:

@ExceptionHandler({CustomException1.class, CustomException2.class})
public ModelAndView handleMultipleExceptions(Exception ex) {
    // 处理多个异常
    ModelAndView modelAndView = new ModelAndView("error");
    modelAndView.addObject("errorMessage", ex.getMessage());
    return modelAndView;
}

可以同时处理多个异常类型,通过在 @ExceptionHandler 注解中指定多个异常类。

全局异常处理:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex) {
        // 处理全局异常
        ModelAndView modelAndView = new ModelAndView("error");
        modelAndView.addObject("errorMessage", "An error occurred: " + ex.getMessage());
        return modelAndView;
    }
}

@ControllerAdvice 注解可以用于全局异常处理,所有控制器中未捕获的异常都会被 handleException 方法处理。

注意事项:

@ExceptionHandler 注解可以在控制器类中的任何方法上使用,用于处理该方法中抛出的指定异常类型的异常。

异常处理方法可以返回不同类型的结果,例如 ModelAndView、ResponseEntity 等,根据需求选择合适的返回类型。

在全局异常处理类中使用 @ControllerAdvice 注解,可以处理整个应用中的异常,提供全局一致的异常处理策略。

使用 @ExceptionHandler 注解可以使得异常处理更加集中和灵活,可以根据具体的业务需求为不同类型的异常定制不同的处理逻辑。

2、@ModelAttribute:

此注解是 Spring Framework 中用于将方法的返回值或方法参数绑定到模型(Model)中的注解。它可以用在方法的参数上或方法的返回值上,用于在视图中访问或修改模型数据。

在方法参数上使用 @ModelAttribute:

@Controller
@RequestMapping("/example")
public class ExampleController {

    @GetMapping("/user")
    public String getUser(@ModelAttribute("user") User user) {
        // 使用@ModelAttribute注解将"user"放入模型中,供视图使用
        // 如果模型中不存在名为"user"的属性,将创建一个新的User对象并放入模型中
        return "userDetails";
    }
}

在上述例子中,@ModelAttribute(“user”) 注解被用于标注 getUser 方法的参数,表示将模型中名为 “user” 的属性绑定到方法参数 User user 上。如果模型中不存在名为 “user” 的属性,Spring 将创建一个新的 User 对象并放入模型中,以供视图使用。

在方法返回值上使用 @ModelAttribute:

@Controller
@RequestMapping("/example")
public class ExampleController {

    @ModelAttribute("currentUser")
    public User getCurrentUser() {
        // 返回一个User对象,将其放入模型中,属性名为"currentUser"
        return new User("John", "Doe");
    }

    @GetMapping("/profile")
    public String userProfile() {
        // 在视图中可以通过${currentUser}获取到User对象
        return "profile";
    }
}

在上述例子中,@ModelAttribute(“currentUser”) 注解被用于标注 getCurrentUser 方法的返回值,表示将方法返回的 User 对象放入模型中,属性名为 “currentUser”。在视图中,可以通过 ${currentUser} 获取到该对象。

注意事项:

@ModelAttribute 注解可以用在方法的参数上,表示将模型中的属性绑定到方法参数上,也可以用在方法的返回值上,表示将方法返回的对象放入模型中。

如果在方法参数上使用 @ModelAttribute,Spring 会尝试从模型中查找对应属性的值,如果找到则绑定,如果没有找到则创建一个新的对象,并将其放入模型中。

如果在方法的返回值上使用 @ModelAttribute,Spring 将该对象放入模型中,并使用指定的属性名(或默认的属性名)。

@ModelAttribute 注解还可以用在方法上,标识在控制器的每个请求处理方法之前执行的方法。这样的方法可以用于初始化一些模型数据。
@Controller
@RequestMapping("/example")
public class ExampleController {

    @ModelAttribute
    public void addCommonAttributes(Model model) {
        model.addAttribute("commonAttribute", "This is a common attribute");
    }

    @GetMapping("/page1")
    public String page1() {
        return "page1";
    }

    @GetMapping("/page2")
    public String page2() {
        return "page2";
    }
}

在上述例子中,addCommonAttributes 方法被标注了 @ModelAttribute,它将在每个请求处理方法之前执行,为模型添加一个名为 “commonAttribute” 的属性。

3、@SessionAttributes:

此注解是 Spring Framework 中用于将模型的特定属性保留在 HTTP 会话中的注解。它可以用在类级别或方法级别上,用于指定哪些模型属性应该存储在会话中,以便它们可以在多个请求之间共享。

在类级别上使用 @SessionAttributes:

@Controller
@RequestMapping("/example")
@SessionAttributes("user")
public class ExampleController {

    @ModelAttribute("user")
    public User getDefaultUser() {
        // 默认的User对象,会被放入模型,并保留在会话中
        return new User("Guest", "User");
    }

    @GetMapping("/home")
    public String home(@ModelAttribute("user") User user) {
        // 访问路径:/example/home
        // 在视图中可以通过${user}获取到User对象
        return "home";
    }
}

在上述例子中,@SessionAttributes(“user”) 注解被用于标注 ExampleController 类,表示 User 对象名为 “user” 的属性将会被存储在会话中。getDefaultUser 方法用于提供一个默认的 User 对象,并将其放入模型中。

在方法级别上使用 @SessionAttributes:

@Controller
@RequestMapping("/example")
public class ExampleController {

    @ModelAttribute("user")
    public User getDefaultUser() {
        // 默认的User对象,会被放入模型
        return new User("Guest", "User");
    }

    @GetMapping("/login")
    public String login() {
        // 访问路径:/example/login
        // 在视图中可以通过${user}获取到User对象
        return "login";
    }

    @GetMapping("/logout")
    public String logout(SessionStatus sessionStatus) {
        // 访问路径:/example/logout
        // 清除会话中的"user"属性
        sessionStatus.setComplete();
        return "logout";
    }
}

在上述例子中,@ModelAttribute(“user”) 注解被用于标注 getDefaultUser 方法,表示 User 对象名为 “user” 的属性将会被存储在会话中。login 方法用于处理登录页面的请求,而 logout 方法用于处理注销页面的请求,并通过 SessionStatus 清除会话中的 “user” 属性。

注意事项:

@SessionAttributes 注解可以用在类级别或方法级别上。

在类级别上使用时,指定的模型属性将被存储在整个会话中,而不仅仅是在单个请求中。

在方法级别上使用时,指定的模型属性将只在当前请求和处理该请求的会话之间共享。可以使用 SessionStatus 的 setComplete() 方法来清除会话中的属性。

当使用 @SessionAttributes 时,需要确保相应的会话管理器已经配置,以便正确管理会话的创建和销毁。

尽量避免将敏感信息放入会话,因为会话可能在多个请求之间共享。

4、@InitBinder:

此注解是 Spring MVC 中的一个注解,用于在控制器中自定义数据绑定初始化逻辑。它可以用在方法上,标识一个方法为初始化绑定器的方法,用于自定义数据绑定的规则。

基本用法:

@Controller
@RequestMapping("/example")
public class ExampleController {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        // 在此方法中可以添加自定义的数据绑定规则
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        CustomDateEditor editor = new CustomDateEditor(dateFormat, true);
        binder.registerCustomEditor(Date.class, editor);
    }

    @GetMapping("/date")
    public String getDate(@RequestParam Date date) {
        // 处理日期参数
        return "date";
    }
}

在上述例子中,@InitBinder 注解被用于标注 initBinder 方法,该方法接收一个 WebDataBinder 参数,通过该参数可以注册自定义的数据编辑器,如上例中的日期编辑器。

多个编辑器的情况:

@Controller
@RequestMapping("/example")
public class ExampleController {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        CustomDateEditor dateEditor = new CustomDateEditor(dateFormat, true);
        binder.registerCustomEditor(Date.class, dateEditor);

        NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.US);
        binder.registerCustomEditor(Integer.class, new CustomNumberEditor(Integer.class, numberFormat, true));
    }

    @GetMapping("/data")
    public String getData(@RequestParam Date date, @RequestParam Integer count) {
        // 处理日期和数字参数
        return "data";
    }
}

在上述例子中,initBinder 方法注册了两个自定义编辑器,一个用于处理日期类型,另一个用于处理整数类型。

注意事项:

@InitBinder 注解可以用在控制器类的方法上,用于指定初始化数据绑定器的方法。

初始化绑定器的方法必须接收一个 WebDataBinder 参数。

在初始化绑定器的方法中,可以使用 binder.registerCustomEditor() 注册自定义的数据编辑器,以适应不同类型的数据绑定需求。

自定义数据编辑器可以用于将字符串转换为特定类型的对象,以及将对象转换为字符串。

除了 @InitBinder 注解,还可以使用 @ModelAttribute 注解来实现对模型属性的全局初始化。

5、@EnableWebMvc:

此注解是 Spring MVC 中的一个注解,它用于启用 Spring MVC 框架的基本功能。通常,当你使用 Spring MVC 架构开发 Web 应用时,需要在配置类上使用 @EnableWebMvc 注解,以启用 Spring MVC。

在经典的 Spring 应用中,@EnableWebMvc 可以用于替代 XML 配置中的 mvc:annotation-driven,它启用了一系列默认配置,包括处理器映射、处理器适配器、视图解析器等,使得开发者能够更方便地使用 Spring MVC。

基本用法:

@Configuration
@EnableWebMvc
@ComponentScan("com.example.web")
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    // 可以添加其他自定义配置
}

在上述例子中,@EnableWebMvc 注解被用于标注 WebConfig 配置类,同时实现了 WebMvcConfigurer 接口,以便在配置类中进行更多的自定义配置。

注意事项:

@EnableWebMvc 注解通常与实现了 WebMvcConfigurer 接口的配置类一起使用,以提供更多的配置选项。

该注解启用了一些默认配置,包括默认的 HandlerMapping、HandlerAdapter、ViewResolver 等。

使用 @EnableWebMvc 时,可以覆盖默认配置,例如通过实现 WebMvcConfigurer 接口来添加拦截器、资源处理器、自定义视图解析器等。

@EnableWebMvc 不是必需的,如果你希望完全自定义 Spring MVC 的配置,你可以选择不使用这个注解。但通常情况下,它会减少一些繁琐的配置工作,使得开发更加便捷。

在 Spring Boot 应用中,通常不需要显式使用 @EnableWebMvc,因为 Spring Boot 已经自动配置了 Spring MVC。如果你需要自定义配置,可以直接在 application.properties 或 application.yml 文件中进行配置。
文章来源:https://blog.csdn.net/qq_44444470/article/details/134467357
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。