在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

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

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

4.類型轉換器

spring目前支持3中類型轉換器:

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

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

第一步,定義一個實體User:

@Data
public class User {

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

第二步,實現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;
    }
}

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

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

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

第四步,調用接口

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

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

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

5.導入配置

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

如果你看過它的源碼會發現,引入的類支持三種不同類型。

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

圖片

5.1 普通類

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

public class A {
}

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

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

@Autowired
private A a;

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

5.2 配置類

這種引入方式是最復雜的,因為@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注解的配置類,會把該配置類相關@Import@ImportResource@PropertySource等注解引入的類進行遞歸,一次性全部引入。

5.3 ImportSelector

這種引入方式需要實現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方法返回的是數組,意味著可以同時引入多個類,還是非常方便的。

5.4 ImportBeanDefinitionRegistrar

這種引入方式需要實現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的創建和注冊。

6.項目啟動時

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

好消息是springboot提供了:

  • CommandLineRunner
  • ApplicationRunner

這兩個接口幫助我們實現以上需求。

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

@Component
public class TestRunner implements ApplicationRunner {

    @Autowired
    private LoadDataService loadDataService;

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

實現ApplicationRunner接口,重寫run方法,在該方法中實現自己定制化需求。

如果項目中有多個類實現了ApplicationRunner接口,他們的執行順序要怎么指定呢?

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

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

    關注

    0

    文章

    340

    瀏覽量

    14881
  • AOP
    AOP
    +關注

    關注

    0

    文章

    40

    瀏覽量

    11206
  • IOC
    IOC
    +關注

    關注

    0

    文章

    28

    瀏覽量

    10291
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    Spring框架的設計理念

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

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

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

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

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

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

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

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

    單片機系統中最常用的三種通信協議是什么?
    發表于 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 ?1187次閱讀

    Spring中最常用的11個擴展

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

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

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

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

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

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

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

    Spring11個最常用擴展分享1

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

    Spring11個最常用擴展分享2

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

    在SIEMENSI工業通訊中最常用的串口介紹

    在SIEMENSI工業通訊最常用的是串口;Profibus;MPI;以太網通訊,在下表中分別對其最大通訊距離進行描述。
    的頭像 發表于 09-06 16:16 ?1209次閱讀
    主站蜘蛛池模板: 黄色大片日本 | 亚洲欧洲色天使日韩精品 | 手机看片神马午夜 | 49pao强力在线高清基地 | 午夜免费啪在线观看视频网站 | 成人欧美一区二区三区白人 | 日本最新免费网站 | 国产色婷婷精品综合在线手机播放 | 情趣店上班h系列小说 | 色免费看| 一级特黄高清完整大片 | 色香焦 | 日产精品卡二卡三卡四卡无卡乱码 | 久久综合亚洲 | 亚洲夜夜爱 | 亚洲男人的天堂在线观看 | 天天搞一搞| 欧美亚洲第一区 | 日本一区二区免费看 | 国产国拍亚洲精品mv在线观看 | 欧美精品videofree720p | 亚洲免费在线观看 | 久久婷婷综合中文字幕 | 亚洲第一免费网站 | 亚洲aa在线| 成年片色大黄全免费网址 | 韩漫免费网站无遮挡羞羞漫画 | 在线免费视频手机版 | 美女扒开尿口给男人桶 | 老色鬼久久综合第一 | 四虎最新永久免费网址 | 黄色一级视频网 | 国产精品久久在线 | 欧美午夜精品久久久久久黑人 | 成年免费大片黄在线观看免费 | 爽死你个放荡粗暴小淫视频 | 亚洲国产日韩精品怡红院 | 日日干干 | 国产精品嫩草影院午夜 | a天堂资源 | 91视频精品|