SpringBoot應(yīng)用開發(fā)锻梳,會(huì)大量的使用注解箭券,有些注解會(huì)經(jīng)常一起使用,如果能通過一個(gè)組合注解進(jìn)行包裝則能夠簡(jiǎn)化代碼疑枯,并且還會(huì)避免因?yàn)樯倭四承┳⒔舛鴪?bào)錯(cuò)
一辩块、 常見的組合注解
1. @SpringBootApplication
該注解是SpringBoot項(xiàng)目的核心注解,該注解包含:
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
@SpringBootApplication 注解就有了自動(dòng)配置功能 荆永、掃描包功能废亭。
@EnableAutoConfiguration 讓SpringBoot根據(jù)類路徑中的jar包依賴為當(dāng)前項(xiàng)目進(jìn)行自動(dòng)配置。例如具钥,添加spring-boot-starter-web依賴豆村,會(huì)自動(dòng)添加tomcat和SpringMVC的依賴,SpringBoot 會(huì)對(duì)Tomcat和SpringMVC進(jìn)行自動(dòng)配置
@ComponentScan 會(huì)自動(dòng)掃描@SpringBootApplication所在類的同級(jí)包以及子包的Bean骂删。所以建議入口類放在groupId+artifactId組合下掌动,或者groupId下。
在SpringBoot項(xiàng)目啟動(dòng)類上用這三個(gè)注解替換@SpringBootApplication也是可以的
2. @Configuration
該注解包含@Component注解宁玫,該注解不單標(biāo)注該類是一個(gè)配置類粗恢,而且聲明該類是一個(gè)Bean
3. @Enable*
@Enable* 類的注解都有一個(gè)@Import注解,該注解是用來導(dǎo)入配置類的欧瘪,其實(shí)就是導(dǎo)入了一些自動(dòng)配置的Bean眷射,有以下三類:
-
直接導(dǎo)入配置類
導(dǎo)入一個(gè)有 @Configuration的Bean
-
依據(jù)條件選擇配置類
導(dǎo)入一個(gè)實(shí)現(xiàn)了ImportSelector接口的配置類
-
動(dòng)態(tài)注冊(cè)Bean
導(dǎo)入一個(gè)實(shí)現(xiàn)了ImportBeanDefinitionRegistrar接口的配置類
本文不做深入探討,會(huì)另出一篇關(guān)于@Import的使用
二、自定義組合注解
我們?cè)谂渲妙惿霞覢ComponentScan時(shí)還會(huì)寫@Configuration我們可以寫一個(gè)組合注解
- 組合注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@ComponentScan
public @interface ComponentScanConfig {
//這個(gè)必須寫妖碉,覆蓋@ComponentScan的注解value的值
String[] value() default {};
}
【注】String[] value() default {}; 是為了覆蓋@ComponentScan的注解value的值
- service
public class CombinationAnnotationTestService {
public void doSth() {
System.out.println("doSth....");
}
}
- 配置類
@ComponentScanConfig("com.jiuxian.combination")
public class CombinationAnnotationConfig {
@Bean
public CombinationAnnotationTestService combinationTestService() {
return new CombinationAnnotationTestService();
}
}
- 測(cè)試
(1)
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(CombinationAnnotationConfig.class);
CombinationAnnotationTestService service = context.getBean(CombinationAnnotationTestService.class);
service.doSth();
context.close();
}
}
(2)
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootAnnotationsApplicationTests {
@Resource
private CombinationAnnotationTestService combinationAnnotationTestService;
@Test
public void combinationTest() {
combinationAnnotationTestService.doSth();
}
}
- 結(jié)果
doSth....