衡阳派盒市场营销有限公司

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

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

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

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

jf_78858299 ? 來源:JAVA旭陽 ? 作者:JAVA旭陽 ? 2023-05-11 10:48 ? 次閱讀

前言

在使用spring的過程中,我們有沒有發(fā)現(xiàn)它的擴展能力很強呢?由于這個優(yōu)勢的存在,使得spring具有很強的包容性,所以很多第三方應用或者框架可以很容易的投入到spring的懷抱中。今天我們主要來學習Spring中很常用的11個擴展點,你用過幾個呢?

1. 類型轉換器

如果接口中接收參數(shù)的實體對象中,有一個字段類型為Date,但實際傳遞的參數(shù)是字符串類型:2022-12-15 10:20:15,該如何處理?

Spring提供了一個擴展點,類型轉換器Type Converter,具體分為3類:

  • Converter: 將類型 S 的對象轉換為類型 T 的對象
  • ConverterFactory: 將 S 類型對象轉換為 R 類型或其子類對象
  • GenericConverter:它支持多種源和目標類型的轉換,還提供了源和目標類型的上下文。此上下文允許您根據(jù)注釋或屬性信息執(zhí)行類型轉換。

還是不明白的話,我們舉個例子吧。

  1. 定義一個用戶對象
@Data
public class User {
    private Long id;
    private String name;
    private Date registerDate;
}
  1. 實現(xiàn)Converter接口
public class DateConverter implements Converter
  1. 將新定義的類型轉換器注入到Spring容器中
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new DateConverter());
    }
}
  1. 調(diào)用接口測試
@RequestMapping("/user")
    @RestController
    public class UserController {
        @RequestMapping("/save")
        public String save(@RequestBody User user) {
            return "success";
        }
    }

請求接口時,前端傳入的日期字符串,會自動轉換成Date類型。

2. 獲取容器Bean

在我們?nèi)粘i_發(fā)中,經(jīng)常需要從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");
    }
}

實現(xiàn)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");
    }
}

實現(xiàn)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. 全局異常處理

以往我們在開發(fā)界面的時候,如果出現(xiàn)異常,要給用戶更友好的提示,例如:

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

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

如果不對請求添加接口結果做任何處理,會直接報錯:

用戶可以直接看到錯誤信息嗎?

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

@GetMapping("/add")
public String add() {
    String result = "success";
    try {
        int a = 10 / 0;
    } catch (Exception e) {
        result = "error";
    }
    return result;
}

界面修改后,出現(xiàn)異常時會提示:“數(shù)據(jù)異常”,更加人性化。

看起來不錯,但是有一個問題。

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

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

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public String handleException(Exception e) {
        if (e instanceof ArithmeticException) {
            return "data error";
        }
        if (e instanceof Exception) {
            return "service error";
        }
        retur null;
    }
}

方法中處理異常只需要handleException,在業(yè)務接口中就可以安心使用,不再需要捕獲異常(統(tǒng)一有人處理)。

4. 自定義攔截器

Spring MVC攔截器,它可以獲得HttpServletRequestHttpServletResponse等web對象實例。

Spring MVC攔截器的頂層接口是HandlerInterceptor,它包含三個方法:

  • preHandle 在目標方法執(zhí)行之前執(zhí)行
  • 執(zhí)行目標方法后執(zhí)行的postHandle
  • afterCompletion 在請求完成時執(zhí)行

為了方便,我們一般繼承HandlerInterceptorAdapter,它實現(xiàn)了HandlerInterceptor

如果有授權鑒權、日志、統(tǒng)計等場景,可以使用該攔截器,我們來演示下吧。

  1. 寫一個類繼承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) {
        return true;
    }
}
  1. 將攔截器注冊到spring容器中
@Configuration
public class WebAuthConfig extends WebMvcConfigurerAdapter {

    @Bean
    public AuthInterceptor getAuthInterceptor() {
        return new AuthInterceptor();
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthInterceptor());
    }
}
  1. Spring MVC在請求接口時可以自動攔截接口,并通過攔截器驗證權限。

5. 導入配置

有時我們需要在某個配置類中引入其他的類,引入的類也加入到Spring容器中。這時候可以使用注解@Import來完成這個功能。

如果你查看它的源代碼,你會發(fā)現(xiàn)導入的類支持三種不同的類型。

但是我覺得最好把普通類的配置類和@Configuration注解分開解釋,所以列出了四種不同的類型:

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

    關注

    27

    文章

    8745

    瀏覽量

    148056
  • 框架
    +關注

    關注

    0

    文章

    403

    瀏覽量

    17543
  • spring
    +關注

    關注

    0

    文章

    340

    瀏覽量

    14390
收藏 人收藏

    評論

    相關推薦

    什么是java spring

    的事情。然而,Spring的用途不僅限于服務器端的開發(fā)。從簡單性、可測試性和松耦合的角度而言,任何Java應用都可以從Spring受益。Spring是一
    發(fā)表于 09-11 11:16

    Spring工作原理

    Spring所提供的這些服務和功能。Spring里用的最經(jīng)典的一設計模式就是:模板方法模式。(這里我都不介紹了,是一常用的設計模式)
    發(fā)表于 07-10 07:41

    啟動Spring Boot項目應用的三種方法

    基礎。我們知道了Spring Boot是什么了,那么我們又該如何啟動Spring Boot應用呢?這里小編給大家推薦常用的三種方法。分別是IDEA編輯器啟動、命令啟動、java命令j
    發(fā)表于 01-14 17:33

    STM32時鐘系統(tǒng)最常用的知識

    ,講一最常用的知識。其它的型號大同小異。時鐘含義特點HSE外部高速時鐘信號一般選擇外接晶振,最常用的時鐘信號。電機驅動板外接12MhzHSI內(nèi)部高速時鐘信號由單片...
    發(fā)表于 08-11 07:39

    高手最常用的電腦五組合鍵

    高手最常用的電腦五組合鍵 winkey+d : 這是高手最常用的第一快捷組合鍵。這個快捷鍵組合可以將桌面上的所有窗口瞬間最小化,無論是聊天的窗口還是
    發(fā)表于 02-24 10:41 ?61次下載

    Spring應用 1 springXML配置說明

    Spring應用 1 springXML配置說明 隱式對Spring容器注冊Process ? context:annotation-config / 為了在spring開發(fā)過程
    發(fā)表于 01-13 12:20 ?402次閱讀

    Spring認證_什么是Spring GraphQL?

    數(shù)據(jù)整合 Spring GraphQL 支持使用 Querydsl 通過 Spring Data Querydsl 擴展 來獲取數(shù)據(jù)。Querydsl 提供了一種靈活但類型安全的方法,通過使用注釋
    的頭像 發(fā)表于 08-09 11:31 ?668次閱讀
    <b class='flag-5'>Spring</b>認證_什么是<b class='flag-5'>Spring</b> GraphQL?

    最常用11款Kubernetes工具

    助于改善 Kubernetes 開發(fā)人員的體驗。本文列出作者自己最常用11 款 Kubernetes 工具,并對它們進行了分類介紹。 Kubernetes 是一非常強大的容器編排平臺。但在
    的頭像 發(fā)表于 08-23 10:43 ?2206次閱讀

    10電源設計最常用公式的解析

    本文將為你解析10電源設計最常用的公式。非常實用,推薦收藏哦~
    發(fā)表于 02-10 11:40 ?8次下載
    10<b class='flag-5'>個</b>電源設計<b class='flag-5'>最常用</b>公式的解析

    Spring最常用11擴展

    除此之外,我們在使用spring的過程,有沒有發(fā)現(xiàn)它的擴展能力非常強。由于這個優(yōu)勢的存在,讓spring擁有強大的包容能力,讓很多第三方應用能夠輕松投入
    的頭像 發(fā)表于 01-11 10:31 ?947次閱讀

    剖析Spring最常用擴展(上)

    我們一說到spring,可能第一想到的是 `IOC`(控制反轉) 和 `AOP`(面向切面編程)。 沒錯,它們是spring的基石,得益于它們的優(yōu)秀設計,使得spring能夠從
    的頭像 發(fā)表于 02-15 16:06 ?793次閱讀
    剖析<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的基石,得益于它們的優(yōu)秀設計,使得spring能夠從
    的頭像 發(fā)表于 02-15 16:06 ?546次閱讀
    剖析<b class='flag-5'>Spring</b>中<b class='flag-5'>最常用</b>的<b class='flag-5'>擴展</b><b class='flag-5'>點</b>(<b class='flag-5'>中</b>)

    剖析Spring最常用擴展(下)

    我們一說到spring,可能第一想到的是 `IOC`(控制反轉) 和 `AOP`(面向切面編程)。 沒錯,它們是spring的基石,得益于它們的優(yōu)秀設計,使得spring能夠從
    的頭像 發(fā)表于 02-15 16:07 ?514次閱讀

    基于spring的SPI擴展機制是如何實現(xiàn)的?

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

    Spring11最常用擴展分享2

    在使用spring的過程,我們有沒有發(fā)現(xiàn)它的擴展能力很強呢?由于這個優(yōu)勢的存在,使得spring具有很強的包容性,所以很多第三方應用或者框架可以很容易的投入到
    的頭像 發(fā)表于 05-11 10:48 ?426次閱讀
    百家乐平注7s88| 郑州百家乐官网的玩法技巧和规则 | 555棋牌游戏| 六合彩教程| 齐齐哈尔市| 如何玩百家乐官网游戏| 缅甸百家乐官网赌场| 百家乐赌博论谈| 威尼斯人娱乐城送| 百乐门娱乐| 免佣百家乐官网规则| 百家乐境外赌博| 百家乐稳赢战术技巧| 大发888被查封| 桃江县| 百家乐官网评测| 百家乐管理启发书| 百家乐存1000送| bet365体育在线注册| 安泽县| 洛克百家乐官网的玩法技巧和规则 | 火箭百家乐的玩法技巧和规则 | 百家乐官网赌博游戏| 风水学坐向24山| 华人百家乐博彩论| 怎么玩百家乐的玩法技巧和规则| 大发888游戏官方下载| 百家乐官网代理龙虎| 在线百家乐官网作| 百家乐合| 嘉祥县| 恒丰百家乐官网的玩法技巧和规则| 百家乐透视牌靴价格| 网上娱乐城排名| 赌百家乐官网到底能赌博赢| 百家乐赌场软件| 弥渡县| 做生意怎样看风水| 大发888娱乐城dafa888dafa8| 百家乐官网电子作弊器| 百家乐家居|