最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot2零基礎(chǔ)到精通之異常處理與web原生組件注入

 更新時(shí)間:2022年03月22日 11:21:31   作者:扎哇太棗糕  
SpringBoot是Spring全家桶的成員之一,基于約定優(yōu)于配置的思想(即有約定默認(rèn)值,在不配置的情況下會(huì)使用默認(rèn)值,在配置文件下配置的話會(huì)使用配置的值)。SpringBoot是一種整合Spring技術(shù)棧的方式(或者說是框架),同時(shí)也是簡(jiǎn)化Spring的一種快速開發(fā)的腳手架

1 異常處理

??默認(rèn)情況下,SpringBoot會(huì)提供/error處理所有的錯(cuò)誤請(qǐng)求并返回相應(yīng)的信息,對(duì)于瀏覽器客戶端來說會(huì)返回一個(gè)包含時(shí)間戳、狀態(tài)碼、錯(cuò)誤信息、攜帶的自定義異常信息、發(fā)生錯(cuò)誤的路徑等信息的錯(cuò)誤Whitelabel頁(yè)面,對(duì)于機(jī)器客戶端(postman等)會(huì)返回一個(gè)包含以上內(nèi)容的JSON數(shù)據(jù)

1.1 異常處理之錯(cuò)誤頁(yè)面

??要想替代之前瀏覽器客戶端返回的錯(cuò)誤Whitelabel頁(yè)面,需要將自定義的html頁(yè)面放在靜態(tài)資源static等的error文件夾下或者模板引擎templates的error文件夾下,這樣的話出現(xiàn)錯(cuò)誤時(shí)SpringBoot發(fā)送/error請(qǐng)求就會(huì)自動(dòng)解析這些頁(yè)面進(jìn)行渲染。頁(yè)面解析規(guī)則:先將狀態(tài)碼的值與error文件夾下的頁(yè)面名進(jìn)行精確匹配,如果精確匹配不到的話就按照4xx、5xx這樣的方式進(jìn)行模糊匹配,要是還匹配不到的話就返回Whitelabel頁(yè)面

在這里插·入圖片描述

1.2 異常處理之精確捕獲

??要是說錯(cuò)誤頁(yè)面是按照狀態(tài)碼進(jìn)行頁(yè)面處理的話,精確捕獲就是通過異常類進(jìn)行捕獲,捕獲之后再進(jìn)行一系列的自定義操作。具體步驟就是:創(chuàng)建一個(gè)異常處理器類,并在類上加@ControllerAdvice注解表明是一個(gè)異常處理器并向容器中注冊(cè)該組件,@ExceptionHandler注解對(duì)參數(shù)中的異常類進(jìn)行精準(zhǔn)捕獲,并在方法體定義具體的處理操作。

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler({ArithmeticException.class, NullPointerException.class})
    public String handleArithException(Exception e) {
        log.info("系統(tǒng)捕獲到異常信息:{}", e);
        return "login";
    }
}

1.3 異常處理之自定義異常

??有時(shí)候我們需要在程序中自定義一些運(yùn)行時(shí)異常,這些異常并不會(huì)像那些異常一樣產(chǎn)生異常狀態(tài)碼,甚至在未定義之前都不算是異常且不會(huì)影響程序的正常運(yùn)行。這時(shí)就需要我們自定義異常的產(chǎn)生邏輯,并自定義異常類創(chuàng)建有參無參構(gòu)造器,在類上加@ResponseStatus注解,使用注解參數(shù)定義異常響應(yīng)碼和異常信息

@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "用戶數(shù)量太多")
public class UserTooManyException extends RuntimeException{

    public UserTooManyException() {

    }
    public UserTooManyException(String message) {
        super(message);
    }
}

異常產(chǎn)生邏輯:

// 判斷用戶數(shù)量拋出用戶數(shù)量過多的自定義異常
if (users.size() > 3) {
    throw new UserTooManyException();
}

1.4 異常處理之框架底層異常

??除了exception類中定義的異常外,spring框架底層也定義了一些異常,這些異常由DefaultHandlerExceptionResolver來處理

2 web原生組件的注入

2.1 servlet組件

??servlet組件需要自定義創(chuàng)建一個(gè)servlet類繼承HttpServlet,并使用@WebServlet注解的urlPatterns屬性聲明攔截的請(qǐng)求,再通過主程序類上使用@ServletComponentScan(basePackages = “…”)注解將該組件掃描注冊(cè)到容器中。

// 聲明攔截的請(qǐng)求
@WebServlet(urlPatterns = "/my")
public class MyServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("385695");
    }
}

2.2 filter組件

??filter組件需要自定義創(chuàng)建一個(gè)filter類實(shí)現(xiàn)Filter接口,并使用@WebFilter注解的urlPatterns屬性聲明過濾的請(qǐng)求

@Slf4j
@WebFilter(urlPatterns = {"/css/*", "/images/*"})
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("MyFilter初始化……");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("MyFilter方法開始工作了……");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        log.info("MyFilter銷毀了……");
    }
}

2.3 listener組件

??listener組件需要自定義創(chuàng)建一個(gè)listener類實(shí)現(xiàn)ServletContextListener 接口,并使用@WebListener注解

@Slf4j
@WebListener
public class MyServletContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        log.info("MyServletContextListener監(jiān)聽到項(xiàng)目初始化完成……");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        log.info("MyServletContextListener監(jiān)聽到項(xiàng)目已經(jīng)銷毀……");
    }
}

除了使用注解進(jìn)行注冊(cè)之外,還可以使用配置類的方式將以上三種組件注冊(cè)到容器中去

@Configuration
public class MyRegistConfig {

    @Bean
    public ServletRegistrationBean MyServlet() {
        MyServlet myServlet = new MyServlet();
        return new ServletRegistrationBean(myServlet, "/my", "/my02");
    }


    @Bean
    public FilterRegistrationBean myFilter() {
        MyFilter myFilter = new MyFilter();
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(myFilter);
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/my", "/my02"));
        return filterRegistrationBean;
    }

    @Bean
    public ServletListenerRegistrationBean myListener() {
        MyServletContextListener listener = new MyServletContextListener();
        return new ServletListenerRegistrationBean(listener);
    }
}

??通過servlet組件聲明的/my請(qǐng)求并不會(huì)經(jīng)過spring的攔截器攔截處理,而是直接交由tomcat服務(wù)器進(jìn)行處理:現(xiàn)在有這么兩個(gè)組件攔截到我們發(fā)送的/my請(qǐng)求,一個(gè)是spring的組件DispatcherServlet通過/路徑攔截到,一個(gè)是tomcat的自定義MyServlet組件通過/my路徑攔截到。tomcat服務(wù)器對(duì)請(qǐng)求有這么一個(gè)處理規(guī)則,當(dāng)多個(gè)servlet組件都能處理到同一個(gè)請(qǐng)求的時(shí)候,使用匹配度最高的組件進(jìn)行處理,也就是說處理請(qǐng)求的是tomcat的MyServlet組件。

3 web實(shí)現(xiàn)定制化總結(jié)

  • 創(chuàng)建配置類實(shí)現(xiàn)WebMvcConfigurer接口,重寫相應(yīng)的方法或者使用@Bean注解向容器中擴(kuò)展功能(使用的最多)
  • 自定義配置類使用@Bean注解使用自定義的web原生組件替換容器中的默認(rèn)組件或者向容器中添加組件
  • 配置文件的配置項(xiàng)修改
  • xxxCustomizer@EnableWebMvc注解表示全面接管SpringMVC,導(dǎo)致的效果就是SpringBoot的所有自動(dòng)配置全部失效,全部功能都需要自己進(jìn)行配置。大佬專屬注解,小白的禁術(shù)?。?!

到此這篇關(guān)于SpringBoot2零基礎(chǔ)到精通之異常處理與web原生組件注入的文章就介紹到這了,更多相關(guān)SpringBoot2 異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring?Boot?詳細(xì)分析Conditional自動(dòng)化配置注解

    Spring?Boot?詳細(xì)分析Conditional自動(dòng)化配置注解

    首先我們先了解一下@Conditional注解,@Conditional是Spring4新提供的注解,它的作用是按照一定的條件進(jìn)行判斷,需要注入的Bean滿足給定條件才可以注入到Spring?IOC容器中
    2022-07-07
  • Mybatis Plugin攔截器開發(fā)過程詳解

    Mybatis Plugin攔截器開發(fā)過程詳解

    這篇文章主要介紹了Mybatis Plugin攔截器開發(fā)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • java?實(shí)現(xiàn)獲取指定位置后的第一個(gè)數(shù)字

    java?實(shí)現(xiàn)獲取指定位置后的第一個(gè)數(shù)字

    這篇文章主要介紹了java?實(shí)現(xiàn)獲取指定位置后的第一個(gè)數(shù)字,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • RocketMq深入分析講解兩種削峰方式

    RocketMq深入分析講解兩種削峰方式

    當(dāng)上游調(diào)用下游服務(wù)速率高于下游服務(wù)接口QPS時(shí),那么如果不對(duì)調(diào)用速率進(jìn)行控制,那么會(huì)發(fā)生很多失敗請(qǐng)求,通過消息隊(duì)列的削峰方法有兩種,這篇文章主要介紹了RocketMq深入分析講解兩種削峰方式
    2023-01-01
  • 如何區(qū)分JAVA中的throws和throw

    如何區(qū)分JAVA中的throws和throw

    這篇文章主要介紹了如何區(qū)分JAVA中的throws和throw,文中講解十分詳細(xì),代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • java使用XSSFWorkbook實(shí)現(xiàn)讀寫Excel

    java使用XSSFWorkbook實(shí)現(xiàn)讀寫Excel

    這篇文章主要為大家詳細(xì)介紹了java如何通過使用XSSFWorkbook實(shí)現(xiàn)讀寫Excel功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • SpringBoot @ConfigurationProperties使用詳解

    SpringBoot @ConfigurationProperties使用詳解

    這篇文章主要介紹了SpringBoot @ConfigurationProperties使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • SpringBoot靜態(tài)資源及原理解析

    SpringBoot靜態(tài)資源及原理解析

    這篇文章主要介紹了SpringBoot靜態(tài)資源及原理解析,當(dāng)創(chuàng)建一個(gè)jar工程時(shí),想引入css等靜態(tài)資源時(shí),需要遵守SpringBoot的靜態(tài)資源映射關(guān)系,通過WebMvcAutoConfiguration查看靜態(tài)配置資源的規(guī)則,需要的朋友可以參考下
    2023-12-12
  • springboot的pom.xml配置方式

    springboot的pom.xml配置方式

    這篇文章主要介紹了springboot的pom.xml配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java的CopyOnWriteArrayList操作詳解

    Java的CopyOnWriteArrayList操作詳解

    這篇文章主要介紹了Java的CopyOnWriteArrayList操作詳解,  CopyOnWriteArrayList是ArrayList 的一個(gè)線程安全的變體,其中所有可變操作(add、set等等)都是通過對(duì)底層數(shù)組進(jìn)行一次新的復(fù)制來實(shí)現(xiàn)的,需要的朋友可以參考下
    2023-12-12

最新評(píng)論

当雄县| 秦皇岛市| 兰西县| 巧家县| 太保市| 武威市| 涿鹿县| 高台县| 丽水市| 离岛区| 兖州市| 青冈县| 九江市| 温宿县| 南汇区| 乌苏市| 衡阳县| 塘沽区| 稷山县| 嘉善县| 郴州市| 伽师县| 济宁市| 桐城市| 斗六市| 通许县| 云阳县| 来凤县| 雅江县| 宁陕县| 元朗区| 陆良县| 邛崃市| 包头市| 莱阳市| 金乡县| 波密县| 揭阳市| 察隅县| 新巴尔虎右旗| 县级市|