springBoot第四天(异常处理及自动配置等)


spring配置

在传统的SSM框架集成中,需要编写大量的XML配置文件,比如集成Mybatis时,需要编写mybatis_config.xml文件,在集成springmvc时,需要编写springmvc.xml文件,这些配置文件十分繁琐,还很容易出现错误,导致开发效率低。而Spring Boot采用约定大于配置的思想,将大量的spring配置文件集成到Spring Boot的内部,帮助开发人员自动配置各类XML文件,极大的简化了开发过程

一、springboot如何开启自动配置?

二、使用步骤

1、当SpringBoot应用启动的时候,就从主方法里面进行启动的。

代码如下(示例):

@SpringBootApplication
public class SpringBoot02ConfigAutoconfigApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBoot02ConfigAutoconfigApplication.class, args);
    }
}

它主要加载了@SpringBootApplication注解主配置类,这个@SpringBootApplication注解主配置类里边最主要的功能就是SpringBoot开启了一个@EnableAutoConfiguration注解的自动配置功能。

2.@EnableAutoConfiguration作用:

它主要利用了一个

EnableAutoConfigurationImportSelector选择器给Spring容器中来导入一些组件。
代码如下(示例):

@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfigurati

底层原理还在研究中

3.@SpringBootConfiguration:

该注解上有一个 @Configuration注解,表示这个spring boot启动类是一个配置类,最终要被注入到spring容器中。

在这里插入图片描述

二、总结springboot如何处理异常的

当后台程序中抛出异常时,springboot默认将错误交由/error地址处理,处理方式可到org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController中查看。 通过现象可以发现springboot的处理方式很简单,只是单纯的跳转到一个错误界面,如图所示
在这里插入图片描述
1.我们可以自定义错误页面
1.在templates目录下面,咱们创建一个error.html页面。只要后台资源发生了异常(不管是什么异常),都统统交给error页面来处理
2.咱们有模板引擎的情况下 直接将错误页面命名为
错误状态码.html放在模板引擎文件夹里面的error文件夹下,发生这个状态就会到对应的页面下
在这里插入图片描述
2.@ExceptionHandle 注解处理异常
在这里插入图片描述

package com.yousian.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

@ControllerAdvice //标识当前类是一个全局异常处理类
public class GlobalException {

    // 处理算术异常
    @ExceptionHandler(value = {java.lang.ArithmeticException.class})
    public ModelAndView handleArithmeticException(Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("error",e.toString());//向页面展示错误信息
        mv.setViewName("error1");
        return mv;
    }

    //处理空指针异常
    @ExceptionHandler(value = {java.lang.NullPointerException.class})
    public ModelAndView handleNullPointerException(Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("error",e.toString());//向页面展示错误信息
        mv.setViewName("error1");
        return mv;
    }

    //处理数组下标越界异常
    @ExceptionHandler(value = {java.lang.ArrayIndexOutOfBoundsException.class})
    public ModelAndView handleArrayIndexOutOfBoundsException(Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("error",e.toString());//向页面展示错误信息
        mv.setViewName("error1");
        return mv;
    }
}

不同异常使用不同注解实现,可以自定义异常信息存储的key,自定义跳转视图的名称,这种方式比较麻烦,没有第一种粗暴简单
它支持一个controller 不支持跨controller
需要编写大量的异常处理方法,不能跨controller,如果两个controller中出现同样的异常,需要重新编写异常处理的方法

3.@ControllerAdvice+@ExceptionHandler 注解处理异常(全局处理异常类)
1.编写异常处理类

package com.yousian.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

@ControllerAdvice //标识当前类是一个全局异常处理类
public class GlobalException {

    // 处理算术异常
    @ExceptionHandler(value = {java.lang.ArithmeticException.class})
    public ModelAndView handleArithmeticException(Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("error",e.toString());//向页面展示错误信息
        mv.setViewName("error1");
        return mv;
    }

    //处理空指针异常
    @ExceptionHandler(value = {java.lang.NullPointerException.class})
    public ModelAndView handleNullPointerException(Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("error",e.toString());//向页面展示错误信息
        mv.setViewName("error1");
        return mv;
    }

    //处理数组下标越界异常
    @ExceptionHandler(value = {java.lang.ArrayIndexOutOfBoundsException.class})
    public ModelAndView handleArrayIndexOutOfBoundsException(Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("error",e.toString());//向页面展示错误信息
        mv.setViewName("error1");
        return mv;
    }
}

4.配置 SimpleMappingExceptionResolver 处理异常

他也是个全局异常处理器
但是他不会显示具体的异常信息
将类注入到spring容器中
在这里插入图片描述

@Configuration
public class GlobalExceptionHandler {

    @Bean
    public SimpleMappingExceptionResolver getExceptionResolver(){
        SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
        Properties properties = new Properties();
//        *//**
//         * 参数1:处理的具体的异常的类型
//         * 参数2:处理异常需要跳转到的视图
//         *//*
        properties.put("java.lang.NullPointerException","error3");
        properties.put("java.lang.ArithmeticException","error3");
        properties.put("java.lang.ArrayIndexOutOfBoundsException","error3");
        resolver.setExceptionMappings(properties);
        return resolver;
    }
}

5.自定义 HandlerExceptionResolver 类处理异常

  • 通过实现 HandlerExceptionResolver 接口做全局异常处理
    在这里插入图片描述

三.在springboot中,如何使用拦截器?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四.在springboot中,如何扩展springmvc的功能

//参照spring boot官方文档,编写自己的config类实现WebMvcConfigurer
If you want to keep Spring Boot MVC features, and you just want to add additional MVC configuration (interceptors, formatters, view controllers etc.) you can add your own @Configuration class of type WebMvcConfigurer, but without @EnableWebMvc. If you wish to provide custom instances of RequestMappingHandlerMapping, RequestMappingHandlerAdapter or ExceptionHandlerExceptionResolver you can declare a WebMvcRegistrationsAdapter instance providing such components.If you want to take complete control of Spring MVC, you can add your own @Configuration annotated with @EnableWebMvc.
//扩展springMVC的功能,既保留了所有的自动配置,也能用扩展配置
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //浏览器发送/lqh  请求会来到success
        registry.addViewController("/ljh").setViewName("success");
    }
}

@EnableWebMvc
全面接管springmvc,相当于之前写的springmvc的配置,完全去掉了自动配置

大概就是这些,博主也在研究中
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值