RM新时代网站-首页

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

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

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

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

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

4.類型轉(zhuǎn)換器

spring目前支持3中類型轉(zhuǎn)換器:

  • Converter:將 S 類型對象轉(zhuǎn)為 T 類型對象
  • ConverterFactory:將 S 類型對象轉(zhuǎn)為 R 類型及子類對象
  • GenericConverter:它支持多個source和目標(biāo)類型的轉(zhuǎn)化,同時還提供了source和目標(biāo)類型的上下文,這個上下文能讓你實(shí)現(xiàn)基于屬性上的注解或信息來進(jìn)行類型轉(zhuǎn)換。

這3種類型轉(zhuǎn)換器使用的場景不一樣,我們以Converter例。假如:接口中接收參數(shù)的實(shí)體對象中,有個字段的類型是Date,但是實(shí)際傳參的是字符串類型:2021-01-03 10:20:15,要如何處理呢?

第一步,定義一個實(shí)體User:

@Data
public class User {

    private Long id;
    private String name;
    private Date registerDate;
}

第二步,實(shí)現(xiàn)Converter接口:

public class DateConverter implements Converter {

    private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public Date convert(String source) {
        if (source != null && !"".equals(source)) {
            try {
                simpleDateFormat.parse(source);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

第三步,將新定義的類型轉(zhuǎn)換器注入到spring容器中:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new DateConverter());
    }
}

第四步,調(diào)用接口

@RequestMapping("/user")
@RestController
public class UserController {

    @RequestMapping("/save")
    public String save(@RequestBody User user) {
        return "success";
    }
}

請求接口時User對象中registerDate字段會被自動轉(zhuǎn)換成Date類型。

5.導(dǎo)入配置

有時我們需要在某個配置類中引入另外一些類,被引入的類也加到spring容器中。這時可以使用@Import注解完成這個功能。

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

但是我認(rèn)為最好將普通類和@Configuration注解的配置類分開講解,所以列了四種不同類型:

圖片

5.1 普通類

這種引入方式是最簡單的,被引入的類會被實(shí)例化bean對象。

public class A {
}

@Import(A.class)
@Configuration
public class TestConfiguration {
}

通過@Import注解引入A類,spring就能自動實(shí)例化A對象,然后在需要使用的地方通過@Autowired注解注入即可:

@Autowired
private A a;

是不是挺讓人意外的?不用加@Bean注解也能實(shí)例化bean。

5.2 配置類

這種引入方式是最復(fù)雜的,因?yàn)?code>@Configuration注解還支持多種組合注解,比如:

  • @Import
  • @ImportResource
  • @PropertySource等。
public class A {
}

public class B {
}

@Import(B.class)
@Configuration
public class AConfiguration {

    @Bean
    public A a() {
        return new A();
    }
}

@Import(AConfiguration.class)
@Configuration
public class TestConfiguration {
}

通過@Import注解引入@Configuration注解的配置類,會把該配置類相關(guān)@Import、@ImportResource、@PropertySource等注解引入的類進(jìn)行遞歸,一次性全部引入。

5.3 ImportSelector

這種引入方式需要實(shí)現(xiàn)ImportSelector接口:

public class AImportSelector implements ImportSelector {

private static final String CLASS_NAME = "com.sue.cache.service.test13.A";
    
 public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{CLASS_NAME};
    }
}

@Import(AImportSelector.class)
@Configuration
public class TestConfiguration {
}

這種方式的好處是selectImports方法返回的是數(shù)組,意味著可以同時引入多個類,還是非常方便的。

5.4 ImportBeanDefinitionRegistrar

這種引入方式需要實(shí)現(xiàn)ImportBeanDefinitionRegistrar接口:

public class AImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(A.class);
        registry.registerBeanDefinition("a", rootBeanDefinition);
    }
}

@Import(AImportBeanDefinitionRegistrar.class)
@Configuration
public class TestConfiguration {
}

這種方式是最靈活的,能在registerBeanDefinitions方法中獲取到BeanDefinitionRegistry容器注冊對象,可以手動控制BeanDefinition的創(chuàng)建和注冊。

6.項(xiàng)目啟動時

有時候我們需要在項(xiàng)目啟動時定制化一些附加功能,比如:加載一些系統(tǒng)參數(shù)、完成初始化、預(yù)熱本地緩存等,該怎么辦呢?

好消息是springboot提供了:

  • CommandLineRunner
  • ApplicationRunner

這兩個接口幫助我們實(shí)現(xiàn)以上需求。

它們的用法還是挺簡單的,以ApplicationRunner接口為例:

@Component
public class TestRunner implements ApplicationRunner {

    @Autowired
    private LoadDataService loadDataService;

    public void run(ApplicationArguments args) throws Exception {
        loadDataService.load();
    }
}

實(shí)現(xiàn)ApplicationRunner接口,重寫run方法,在該方法中實(shí)現(xiàn)自己定制化需求。

如果項(xiàng)目中有多個類實(shí)現(xiàn)了ApplicationRunner接口,他們的執(zhí)行順序要怎么指定呢?

答案是使用@Order(n)注解,n的值越小越先執(zhí)行。當(dāng)然也可以通過@Priority注解指定順序。

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

    關(guān)注

    0

    文章

    340

    瀏覽量

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

    關(guān)注

    0

    文章

    40

    瀏覽量

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

    關(guān)注

    0

    文章

    28

    瀏覽量

    10099
收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    我們一說到spring,可能第一個想到的是 `IOC`(控制反轉(zhuǎn)) 和 `AOP`(面向切面編程)。 沒錯,它們是spring的基石,得益于它們的優(yōu)秀設(shè)計(jì),使得spring能夠從眾多優(yōu)秀框架
    的頭像 發(fā)表于 02-15 16:06 ?747次閱讀
    <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)(下)

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

    電子線路中最常用的元器件在射頻電路又會是什么情況呢?

    電阻,電容和電感是電子線路中最常用的元器件,在低頻電子線路或者直流電路,這些元器件的特性很一致。
    的頭像 發(fā)表于 02-20 09:09 ?1181次閱讀

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

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

    Spring11個最常用擴(kuò)展點(diǎn)分享1

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

    Spring11個最常用擴(kuò)展點(diǎn)分享2

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

    在SIEMENSI工業(yè)通訊中最常用的串口介紹

    在SIEMENSI工業(yè)通訊最常用的是串口;Profibus;MPI;以太網(wǎng)通訊,在下表中分別對其最大通訊距離進(jìn)行描述。
    的頭像 發(fā)表于 09-06 16:16 ?953次閱讀
    RM新时代网站-首页