一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

剖析Spring中最常用的擴(kuò)展點(diǎn)(上)

jf_78858299 ? 來(lái)源:蘇三說(shuō)技術(shù) ? 作者:蘇三說(shuō)技術(shù) ? 2023-02-15 16:06 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

沒(méi)錯(cuò),它們是spring的基石,得益于它們的優(yōu)秀設(shè)計(jì),使得spring能夠從眾多優(yōu)秀框架中脫穎而出。

除此之外,我們?cè)谑褂胹pring的過(guò)程中,有沒(méi)有發(fā)現(xiàn)它的擴(kuò)展能力非常強(qiáng)。由于這個(gè)優(yōu)勢(shì)的存在,讓spring擁有強(qiáng)大的包容能力,讓很多第三方應(yīng)用能夠輕松投入spring的懷抱。比如:rocketmq、mybatis、redis等。

今天跟大家一起聊聊,在Spring中最常用的11個(gè)擴(kuò)展點(diǎn)。圖片

1.自定義攔截器

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

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

  • preHandle 目標(biāo)方法執(zhí)行前執(zhí)行
  • postHandle 目標(biāo)方法執(zhí)行后執(zhí)行
  • afterCompletion 請(qǐng)求完成時(shí)執(zhí)行

為了方便我們一般情況會(huì)用HandlerInterceptor接口的實(shí)現(xiàn)類(lèi)HandlerInterceptorAdapter類(lèi)。

假如有權(quán)限認(rèn)證、日志、統(tǒng)計(jì)的場(chǎng)景,可以使用該攔截器。

第一步,繼承HandlerInterceptorAdapter類(lèi)定義攔截器:

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("===權(quán)限校驗(yàn)===");
        return true;
    }
}

第二步,將該攔截器注冊(cè)到spring容器:

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

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

第三步,在請(qǐng)求接口時(shí)spring mvc通過(guò)該攔截器,能夠自動(dòng)攔截該接口,并且校驗(yàn)權(quán)限。

2.獲取Spring容器對(duì)象

在我們?nèi)粘i_(kāi)發(fā)中,經(jīng)常需要從Spring容器中獲取Bean,但你知道如何獲取Spring容器對(duì)象嗎?

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");
    }
}

實(shí)現(xiàn)BeanFactoryAware接口,然后重寫(xiě)setBeanFactory方法,就能從該方法中獲取到spring容器對(duì)象。

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");
    }
}

實(shí)現(xiàn)ApplicationContextAware接口,然后重寫(xiě)setApplicationContext方法,也能從該方法中獲取到spring容器對(duì)象。

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.全局異常處理

以前我們?cè)陂_(kāi)發(fā)接口時(shí),如果出現(xiàn)異常,為了給用戶(hù)一個(gè)更友好的提示,例如:

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

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

如果不做任何處理請(qǐng)求add接口結(jié)果直接報(bào)錯(cuò):

圖片

what?用戶(hù)能直接看到錯(cuò)誤信息?

這種交互方式給用戶(hù)的體驗(yàn)非常差,為了解決這個(gè)問(wèn)題,我們通常會(huì)在接口中捕獲異常:

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

接口改造后,出現(xiàn)異常時(shí)會(huì)提示:“數(shù)據(jù)異?!?,對(duì)用戶(hù)來(lái)說(shuō)更友好。

看起來(lái)挺不錯(cuò)的,但是有問(wèn)題。。。

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

答案是否定的,這時(shí)全局異常處理就派上用場(chǎng)了:RestControllerAdvice。

@RestControllerAdvice
public class GlobalExceptionHandler {

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    15064
  • AOP
    AOP
    +關(guān)注

    關(guān)注

    0

    文章

    41

    瀏覽量

    11254
  • IOC
    IOC
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    10368
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Spring框架的設(shè)計(jì)理念

    Spring作為現(xiàn)在最優(yōu)秀的框架之一,已被廣泛的使用,51CTO也曾經(jīng)針對(duì)Spring框架中的hqC應(yīng)用做過(guò)報(bào)道。本文將從另外一個(gè)視角試圖剖析Spring框架的作者設(shè)計(jì)
    發(fā)表于 07-15 08:17

    電路中最常見(jiàn)到的電容使用方法

    基于電容常用功能,詳細(xì)介紹各功能應(yīng)用電路中最常見(jiàn)到的電容使用方法
    發(fā)表于 03-17 08:08

    請(qǐng)問(wèn)射擊探測(cè)器中最常用的口徑是什么?

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

    單片機(jī)系統(tǒng)中最常用的三種通信協(xié)議

    UART、 I2C 和 SPI 是單片機(jī)系統(tǒng)中最常用的三種通信協(xié)議。1、初步介紹SPI 是一種高速的、全雙工、同步通信總線(xiàn),標(biāo)準(zhǔn)的 SPI 也僅僅使用 4 個(gè)引腳,常用于單片機(jī)和 EEPROM
    發(fā)表于 11-18 09:22

    開(kāi)關(guān)電源中最常用的電阻有哪些呢

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

    單片機(jī)系統(tǒng)中最常用的通信協(xié)議有幾種

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

    單片機(jī)系統(tǒng)中最常用的三種通信協(xié)議是什么?

    單片機(jī)系統(tǒng)中最常用的三種通信協(xié)議是什么?
    發(fā)表于 02-17 06:03

    EMC問(wèn)題中最常用的手段RC濾波詳細(xì)資料說(shuō)明

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

    聯(lián)網(wǎng)應(yīng)用中最常用的傳感器是什么?

    環(huán)境、運(yùn)動(dòng)、光電/圖像和健康監(jiān)測(cè)傳感器是物聯(lián)網(wǎng)應(yīng)用中最常用的傳感器類(lèi)型
    的頭像 發(fā)表于 08-16 11:26 ?1234次閱讀

    Spring中最常用的11個(gè)擴(kuò)展點(diǎn)

    除此之外,我們?cè)谑褂?b class='flag-5'>spring的過(guò)程中,有沒(méi)有發(fā)現(xiàn)它的擴(kuò)展能力非常強(qiáng)。由于這個(gè)優(yōu)勢(shì)的存在,讓spring擁有強(qiáng)大的包容能力,讓很多第三方應(yīng)用能夠輕松投入spring的懷抱。比如:ro
    的頭像 發(fā)表于 01-11 10:31 ?1105次閱讀

    剖析Spring中最常用擴(kuò)展點(diǎn)(中)

    我們一說(shuō)到spring,可能第一個(gè)想到的是 `IOC`(控制反轉(zhuǎn)) 和 `AOP`(面向切面編程)。 沒(méi)錯(cuò),它們是spring的基石,得益于它們的優(yōu)秀設(shè)計(jì),使得spring能夠從眾多優(yōu)秀框架中脫穎而出。
    的頭像 發(fā)表于 02-15 16:06 ?720次閱讀
    <b class='flag-5'>剖析</b><b class='flag-5'>Spring</b><b class='flag-5'>中最常用</b>的<b class='flag-5'>擴(kuò)展</b><b class='flag-5'>點(diǎn)</b>(中)

    剖析Spring中最常用擴(kuò)展點(diǎn)(下)

    我們一說(shuō)到spring,可能第一個(gè)想到的是 `IOC`(控制反轉(zhuǎn)) 和 `AOP`(面向切面編程)。 沒(méi)錯(cuò),它們是spring的基石,得益于它們的優(yōu)秀設(shè)計(jì),使得spring能夠從眾多優(yōu)秀框架中脫穎而出。
    的頭像 發(fā)表于 02-15 16:07 ?672次閱讀

    基于spring的SPI擴(kuò)展機(jī)制是如何實(shí)現(xiàn)的?

    基本,你一說(shuō)是基于 spring 的 SPI 擴(kuò)展機(jī)制,再把spring.factories文件和EnableAutoConfiguration提一下,那么這個(gè)問(wèn)題就答的八九不離十了
    的頭像 發(fā)表于 03-07 09:17 ?1349次閱讀

    Spring中11個(gè)最常用擴(kuò)展點(diǎn)分享1

    在使用spring的過(guò)程中,我們有沒(méi)有發(fā)現(xiàn)它的擴(kuò)展能力很強(qiáng)呢?由于這個(gè)優(yōu)勢(shì)的存在,使得spring具有很強(qiáng)的包容性,所以很多第三方應(yīng)用或者框架可以很容易的投入到spring的懷抱中。今
    的頭像 發(fā)表于 05-11 10:48 ?785次閱讀

    Spring中11個(gè)最常用擴(kuò)展點(diǎn)分享2

    在使用spring的過(guò)程中,我們有沒(méi)有發(fā)現(xiàn)它的擴(kuò)展能力很強(qiáng)呢?由于這個(gè)優(yōu)勢(shì)的存在,使得spring具有很強(qiáng)的包容性,所以很多第三方應(yīng)用或者框架可以很容易的投入到spring的懷抱中。今
    的頭像 發(fā)表于 05-11 10:48 ?552次閱讀