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
注解指定順序。
-
spring
+關(guān)注
關(guān)注
0文章
340瀏覽量
14338 -
AOP
+關(guān)注
關(guān)注
0文章
40瀏覽量
11098 -
IOC
+關(guān)注
關(guān)注
0文章
28瀏覽量
10099
發(fā)布評論請先 登錄
相關(guān)推薦
評論