色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

剖析Spring中最常用的擴展點(上)

jf_78858299 ? 來源:蘇三說技術 ? 作者:蘇三說技術 ? 2023-02-15 16:06 ? 次閱讀

我們一說到spring,可能第一個想到的是 IOC(控制反轉) 和 AOP(面向切面編程)。

沒錯,它們是spring的基石,得益于它們的優秀設計,使得spring能夠從眾多優秀框架中脫穎而出。

除此之外,我們在使用spring的過程中,有沒有發現它的擴展能力非常強。由于這個優勢的存在,讓spring擁有強大的包容能力,讓很多第三方應用能夠輕松投入spring的懷抱。比如:rocketmq、mybatis、redis等。

今天跟大家一起聊聊,在Spring中最常用的11個擴展點。圖片

1.自定義攔截器

spring mvc攔截器根spring攔截器相比,它里面能夠獲取HttpServletRequestHttpServletResponse等web對象實例。

spring mvc攔截器的頂層接口是:HandlerInterceptor,包含三個方法:

  • preHandle 目標方法執行前執行
  • postHandle 目標方法執行后執行
  • afterCompletion 請求完成時執行

為了方便我們一般情況會用HandlerInterceptor接口的實現類HandlerInterceptorAdapter類。

假如有權限認證、日志、統計的場景,可以使用該攔截器。

第一步,繼承HandlerInterceptorAdapter類定義攔截器:

public class AuthInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        String requestUrl = request.getRequestURI();
        if (checkAuth(requestUrl)) {
            return true;
        }

        return false;
    }

    private boolean checkAuth(String requestUrl) {
        System.out.println("===權限校驗===");
        return true;
    }
}

第二步,將該攔截器注冊到spring容器:

@Configuration
public class WebAuthConfig extends WebMvcConfigurerAdapter {
 
    @Bean
    public AuthInterceptor getAuthInterceptor() {
        return new AuthInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthInterceptor());
    }
}

第三步,在請求接口時spring mvc通過該攔截器,能夠自動攔截該接口,并且校驗權限。

2.獲取Spring容器對象

在我們日常開發中,經常需要從Spring容器中獲取Bean,但你知道如何獲取Spring容器對象嗎?

2.1 BeanFactoryAware接口

@Service
public class PersonService implements BeanFactoryAware {
    private BeanFactory beanFactory;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }

    public void add() {
        Person person = (Person) beanFactory.getBean("person");
    }
}

實現BeanFactoryAware接口,然后重寫setBeanFactory方法,就能從該方法中獲取到spring容器對象。

2.2 ApplicationContextAware接口

@Service
public class PersonService2 implements ApplicationContextAware {
    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    public void add() {
        Person person = (Person) applicationContext.getBean("person");
    }
}

實現ApplicationContextAware接口,然后重寫setApplicationContext方法,也能從該方法中獲取到spring容器對象。

2.3 ApplicationListener接口

@Service
public class PersonService3 implements ApplicationListener<ContextRefreshedEvent> {
    private ApplicationContext applicationContext;
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        applicationContext = event.getApplicationContext();
    }

    public void add() {
        Person person = (Person) applicationContext.getBean("person");
    }
}

3.全局異常處理

以前我們在開發接口時,如果出現異常,為了給用戶一個更友好的提示,例如:

@RequestMapping("/test")
@RestController
public class TestController {

    @GetMapping("/add")
    public String add() {
        int a = 10 / 0;
        return "成功";
    }
}

如果不做任何處理請求add接口結果直接報錯:

圖片

what?用戶能直接看到錯誤信息

這種交互方式給用戶的體驗非常差,為了解決這個問題,我們通常會在接口中捕獲異常:

@GetMapping("/add")
public String add() {
    String result = "成功";
    try {
        int a = 10 / 0;
    } catch (Exception e) {
        result = "數據異常";
    }
    return result;
}

接口改造后,出現異常時會提示:“數據異常”,對用戶來說更友好。

看起來挺不錯的,但是有問題。。。

如果只是一個接口還好,但是如果項目中有成百上千個接口,都要加上異常捕獲代碼嗎?

答案是否定的,這時全局異常處理就派上用場了:RestControllerAdvice

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public String handleException(Exception e) {
        if (e instanceof ArithmeticException) {
            return "數據異常";
        }
        if (e instanceof Exception) {
            return "服務器內部異常";
        }
        retur nnull;
    }
}

只需在handleException方法中處理異常情況,業務接口中可以放心使用,不再需要捕獲異常(有人統一處理了)。真是爽歪歪。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • spring
    +關注

    關注

    0

    文章

    340

    瀏覽量

    14338
  • AOP
    AOP
    +關注

    關注

    0

    文章

    40

    瀏覽量

    11098
  • IOC
    IOC
    +關注

    關注

    0

    文章

    28

    瀏覽量

    10099
收藏 人收藏

    評論

    相關推薦

    Spring框架的設計理念

    Spring作為現在最優秀的框架之一,已被廣泛的使用,51CTO也曾經針對Spring框架中的hqC應用做過報道。本文將從另外一個視角試圖剖析Spring框架的作者設計
    發表于 07-15 08:17

    電路中最常見到的電容使用方法

    基于電容常用功能,詳細介紹各功能應用電路中最常見到的電容使用方法
    發表于 03-17 08:08

    請問射擊探測器中最常用的口徑是什么?

    射擊探測器中最常用的口徑是什么?
    發表于 04-12 06:56

    單片機系統中最常用的三種通信協議

    UART、 I2C 和 SPI 是單片機系統中最常用的三種通信協議。1、初步介紹SPI 是一種高速的、全雙工、同步通信總線,標準的 SPI 也僅僅使用 4 個引腳,常用于單片機和 EEPROM
    發表于 11-18 09:22

    開關電源中最常用的電阻有哪些呢

    一 電阻1.開關電源中最常用的電阻有貼片電阻、插件色環電阻、壓敏電阻、熱敏電阻等。2.貼片電阻2.1 貼片電阻:主要按封裝和功率來分,常用的有0402 1/16W; 0603 1/10W; 0805
    發表于 12-29 06:14

    單片機系統中最常用的通信協議有幾種

    )、MOSI(主機輸出從機輸入Master Output/Slave Input)和MISO(主機輸入從機輸出Master Input/Slave Output)。單片機系統中最常用的通信協議有三種,分...
    發表于 02-17 07:43

    單片機系統中最常用的三種通信協議是什么?

    單片機系統中最常用的三種通信協議是什么?
    發表于 02-17 06:03

    EMC問題中最常用的手段RC濾波詳細資料說明

    讓我們一起來看看處理 EMC 問題中最常用的手段 -RC 濾波。本文介紹了濾波的概念,并詳細說明了電阻 - 電容(RC)低通濾波器的用途和特性。
    發表于 12-25 07:08 ?8次下載
    EMC問題<b class='flag-5'>中最常用</b>的手段RC濾波詳細資料說明

    聯網應用中最常用的傳感器是什么?

    環境、運動、光電/圖像和健康監測傳感器是物聯網應用中最常用的傳感器類型
    的頭像 發表于 08-16 11:26 ?965次閱讀

    Spring中最常用的11個擴展

    除此之外,我們在使用spring的過程中,有沒有發現它的擴展能力非常強。由于這個優勢的存在,讓spring擁有強大的包容能力,讓很多第三方應用能夠輕松投入spring的懷抱。比如:ro
    的頭像 發表于 01-11 10:31 ?886次閱讀

    剖析Spring中最常用擴展(中)

    我們一說到spring,可能第一個想到的是 `IOC`(控制反轉) 和 `AOP`(面向切面編程)。 沒錯,它們是spring的基石,得益于它們的優秀設計,使得spring能夠從眾多優秀框架中脫穎而出。
    的頭像 發表于 02-15 16:06 ?503次閱讀
    <b class='flag-5'>剖析</b><b class='flag-5'>Spring</b><b class='flag-5'>中最常用</b>的<b class='flag-5'>擴展</b><b class='flag-5'>點</b>(中)

    剖析Spring中最常用擴展(下)

    我們一說到spring,可能第一個想到的是 `IOC`(控制反轉) 和 `AOP`(面向切面編程)。 沒錯,它們是spring的基石,得益于它們的優秀設計,使得spring能夠從眾多優秀框架中脫穎而出。
    的頭像 發表于 02-15 16:07 ?461次閱讀

    基于spring的SPI擴展機制是如何實現的?

    基本,你一說是基于 spring 的 SPI 擴展機制,再把spring.factories文件和EnableAutoConfiguration提一下,那么這個問題就答的八九不離十了
    的頭像 發表于 03-07 09:17 ?1045次閱讀

    Spring中11個最常用擴展分享1

    在使用spring的過程中,我們有沒有發現它的擴展能力很強呢?由于這個優勢的存在,使得spring具有很強的包容性,所以很多第三方應用或者框架可以很容易的投入到spring的懷抱中。今
    的頭像 發表于 05-11 10:48 ?555次閱讀

    Spring中11個最常用擴展分享2

    在使用spring的過程中,我們有沒有發現它的擴展能力很強呢?由于這個優勢的存在,使得spring具有很強的包容性,所以很多第三方應用或者框架可以很容易的投入到spring的懷抱中。今
    的頭像 發表于 05-11 10:48 ?392次閱讀
    主站蜘蛛池模板: 国产精品一区二区20P| 特大巨黑人吊性xxxxgay| 国产99视频精品免费播放| 伊人青青久| 污污内射在线观看一区二区少妇| 免费女人光着全身网站| 久久久精品久久久久久| 精品午夜国产福利观看| 国产乱国产乱老熟300部视频| 被窝伦理午夜电影网| japanesematur乱儿| 92电影网午夜福利| 在线观看成人免费| 中文字幕无码A片久久| 亚洲精品高清视频| 香蕉eeww99国产精品| 性色AV一区二区三区V视界影院| 十九禁啊啪射视频在线观看| 欧美高清18| 欧美精品九九99久久在观看| 欧美大香线蕉线伊人久久| 久久青青草原| 蜜柚视频高清在线| 欧美成 人 网 站 免费| 全免费A敌肛交毛片免费懂色AV| 免费视频国产| 日日碰狠狠添天天爽| 羞羞漫画在线播放| 一色屋精品亚洲香蕉网站| 综合精品欧美日韩国产在线| 99久久免费精品国产免费| 超碰97人人做人人爱亚洲尤物| 国产成人片视频一区二区青青 | 麻豆成人啪啪色婷婷久久 | 麻豆一二三四区乱码| 嫩草影院在线观看精品| 欧洲video60| 亚洲精品国产高清不卡在线| 专干老肥熟女视频网站300部| 补课H湿 1V1 PLAY| 国产色播视频在线观看|