4.類型轉(zhuǎn)換器
spring目前支持3中類型轉(zhuǎn)換器:
- Converter
:將 S 類型對(duì)象轉(zhuǎn)為 T 類型對(duì)象 - ConverterFactory
:將 S 類型對(duì)象轉(zhuǎn)為 R 類型及子類對(duì)象 - GenericConverter:它支持多個(gè)source和目標(biāo)類型的轉(zhuǎn)化,同時(shí)還提供了source和目標(biāo)類型的上下文,這個(gè)上下文能讓你實(shí)現(xiàn)基于屬性上的注解或信息來(lái)進(jìn)行類型轉(zhuǎn)換。
這3種類型轉(zhuǎn)換器使用的場(chǎng)景不一樣,我們以Converter
例。假如:接口中接收參數(shù)的實(shí)體對(duì)象中,有個(gè)字段的類型是Date,但是實(shí)際傳參的是字符串類型:2021-01-03 10:20:15,要如何處理呢?為
第一步,定義一個(gè)實(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";
}
}
請(qǐng)求接口時(shí)User對(duì)象中registerDate字段會(huì)被自動(dòng)轉(zhuǎn)換成Date類型。
5.導(dǎo)入配置
有時(shí)我們需要在某個(gè)配置類中引入另外一些類,被引入的類也加到spring容器中。這時(shí)可以使用@Import
注解完成這個(gè)功能。
如果你看過(guò)它的源碼會(huì)發(fā)現(xiàn),引入的類支持三種不同類型。
但是我認(rèn)為最好將普通類和@Configuration注解的配置類分開(kāi)講解,所以列了四種不同類型:
5.1 普通類
這種引入方式是最簡(jiǎn)單的,被引入的類會(huì)被實(shí)例化bean對(duì)象。
public class A {
}
@Import(A.class)
@Configuration
public class TestConfiguration {
}
通過(guò)@Import
注解引入A類,spring就能自動(dòng)實(shí)例化A對(duì)象,然后在需要使用的地方通過(guò)@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 {
}
通過(guò)@Import注解引入@Configuration注解的配置類,會(huì)把該配置類相關(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ù)組,意味著可以同時(shí)引入多個(gè)類,還是非常方便的。
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
容器注冊(cè)對(duì)象,可以手動(dòng)控制BeanDefinition的創(chuàng)建和注冊(cè)。
6.項(xiàng)目啟動(dòng)時(shí)
有時(shí)候我們需要在項(xiàng)目啟動(dòng)時(shí)定制化一些附加功能,比如:加載一些系統(tǒng)參數(shù)、完成初始化、預(yù)熱本地緩存等,該怎么辦呢?
好消息是springboot提供了:
- CommandLineRunner
- ApplicationRunner
這兩個(gè)接口幫助我們實(shí)現(xiàn)以上需求。
它們的用法還是挺簡(jiǎ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
接口,重寫(xiě)run
方法,在該方法中實(shí)現(xiàn)自己定制化需求。
如果項(xiàng)目中有多個(gè)類實(shí)現(xiàn)了ApplicationRunner接口,他們的執(zhí)行順序要怎么指定呢?
答案是使用@Order(n)
注解,n的值越小越先執(zhí)行。當(dāng)然也可以通過(guò)@Priority
注解指定順序。
-
spring
+關(guān)注
關(guān)注
0文章
340瀏覽量
14398 -
AOP
+關(guān)注
關(guān)注
0文章
40瀏覽量
11124 -
IOC
+關(guān)注
關(guān)注
0文章
28瀏覽量
10148
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Spring框架的設(shè)計(jì)理念
開(kāi)關(guān)電源中最常用的電阻有哪些呢
EMC問(wèn)題中最常用的手段RC濾波詳細(xì)資料說(shuō)明
![EMC問(wèn)題<b class='flag-5'>中最常用</b>的手段RC濾波詳細(xì)資料說(shuō)明](https://file.elecfans.com/web1/M00/D7/4D/pIYBAF_likGACjQyAAE8wtvt6n4833.png)
聯(lián)網(wǎng)應(yīng)用中最常用的傳感器是什么?
Spring中最常用的11個(gè)擴(kuò)展點(diǎn)
剖析Spring中最常用的擴(kuò)展點(diǎn)(上)
![<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>(上)](https://file.elecfans.com/web2/M00/91/89/pYYBAGPskaeACHqYAAJpkEr10mM116.jpg)
評(píng)論