在线观看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

    瀏覽量

    14880
  • 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 ?1071次閱讀

    剖析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 ?1522次閱讀

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

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

    Spring11個最常用擴展分享1

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

    Spring11個最常用擴展分享2

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

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

    在SIEMENSI工業通訊最常用的是串口;Profibus;MPI;以太網通訊,在下表中分別對其最大通訊距離進行描述。
    的頭像 發表于 09-06 16:16 ?1208次閱讀
    主站蜘蛛池模板: 奇米影色777四色在线首页 | 99久久婷婷国产综合精品电影 | 女人十六毛片 | www.丁香.com | 男女交黄 | www狠狠| 色操网| 天天操天天舔天天干 | 美女被啪到哭网站在线观看 | 中文字幕久久精品波多野结 | 中国同志chinese小彬tv | 色综合久久综合欧美综合网 | 久久亚洲国产午夜精品理论片 | 制服丝袜在线一区 | 美女张开腿露出尿口让男人桶 | 中文字幕欧美日韩 | 天堂网在线最新版www | 亚洲午夜久久久久久噜噜噜 | 成人丁香婷婷 | 久久性妇女精品免费 | 男女交性视频免费播放视频 | 四虎影院永久在线观看 | 四虎电影免费观看网站 | 男人天堂网在线观看 | 欧美在线区 | 青草国产在线视频 | 日本色片在线观看 | 日本不卡在线观看 | 不卡视频免费在线观看 | 国产免费亚洲 | 毛片网站免费在线观看 | 青青伊人91久久福利精品 | 手机在线看片国产 | 色综合天天综一个色天天综合网 | 91黄视频在线观看 | 色噜噜狠狠狠综合曰曰曰 | 日本国产黄色片 | 久青草国产在线视频_久青草免 | www.四虎.com | 男女一区二区三区免费 | 色www视频永久免费 色www视频永久免费软件 |