SpringBoot應用開發,會大量的使用註解,有些註解會經常一起使用,如果能通過一個組合註解進行包裝則能夠簡化程式碼,並且還會避免因為少了某些註解而報錯
一、 常見的組合註解
1. @SpringBootApplication
該註解是SpringBoot專案的核心註解,該註解包含:
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
@SpringBootApplication 註解就有了自動配置功能 、掃描包功能。
@EnableAutoConfiguration 讓SpringBoot根據類路徑中的jar包依賴為當前專案進行自動配置。例如,新增spring-boot-starter-web依賴,會自動新增tomcat和SpringMVC的依賴,SpringBoot 會對Tomcat和SpringMVC進行自動配置
@ComponentScan 會自動掃描@SpringBootApplication所在類的同級包以及子包的Bean。所以建議入口類放在groupId+artifactId組合下,或者groupId下。
在SpringBoot專案啟動類上用這三個註解替換@SpringBootApplication也是可以的
2. @Configuration
該註解包含@Component註解,該註解不單標註該類是一個配置類,而且宣告該類是一個Bean
3. @Enable*
@Enable* 類的註解都有一個@Import註解,該註解是用來匯入配置類的,其實就是匯入了一些自動配置的Bean,有以下三類:
-
直接匯入配置類
匯入一個有 @Configuration的Bean
-
依據條件選擇配置類
匯入一個實現了ImportSelector介面的配置類
-
動態註冊Bean
匯入一個實現了ImportBeanDefinitionRegistrar介面的配置類
本文不做深入探討,會另出一篇關於@Import的使用
二、自定義組合註解
我們在配置類上加@ComponentScan時還會寫@Configuration我們可以寫一個組合註解
- 組合註解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@ComponentScan
public @interface ComponentScanConfig {
//這個必須寫,覆蓋@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();
}
}
複製程式碼
- 測試
(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();
}
}
複製程式碼
- 結果
doSth....
複製程式碼