Spring Boot 自動配置之組合註解

來醉一場發表於2019-01-29

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,有以下三類:

  1. 直接匯入配置類

    匯入一個有 @Configuration的Bean

  2. 依據條件選擇配置類

    匯入一個實現了ImportSelector介面的配置類

  3. 動態註冊Bean

    匯入一個實現了ImportBeanDefinitionRegistrar介面的配置類

本文不做深入探討,會另出一篇關於@Import的使用

二、自定義組合註解

我們在配置類上加@ComponentScan時還會寫@Configuration我們可以寫一個組合註解

  1. 組合註解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@ComponentScan
public @interface ComponentScanConfig {
    
    //這個必須寫,覆蓋@ComponentScan的註解value的值
    String[] value() default {};
}

複製程式碼

【注】String[] value() default {}; 是為了覆蓋@ComponentScan的註解value的值

  1. service
public class CombinationAnnotationTestService {

    public void doSth() {
        System.out.println("doSth....");
    }
}
複製程式碼
  1. 配置類
@ComponentScanConfig("com.jiuxian.combination")
public class CombinationAnnotationConfig {

    @Bean
    public CombinationAnnotationTestService combinationTestService() {
        return new CombinationAnnotationTestService();
    }
}
複製程式碼
  1. 測試

(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();
    }

}
複製程式碼
  1. 結果
doSth....
複製程式碼

三、GitHub原始碼

GitHub原始碼

相關文章