Spring學習總結(6)-@Component和@ComponentScan注解


  參考文檔:https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/core.html#beans-stereotype-annotations

1、@Component

  @Component 被稱為元注釋,它是@Repository、@Service、@Controller、@Configuration的父類,理論上可以使用@Component來注釋任何需要Spring自動裝配的類。但每個注釋都有他們自己的作用,用來區分類的作用,Spring文檔上也說明后續版本中可能為@Repository、@Service、@Controller、@Configuration這些注釋添加其他功能,所以建議大家還是少使用@Component。

  @Repository注解是任何滿足存儲庫角色或構造型(也稱為數據訪問對象或DAO)的類的標記。該標記的用途之一是異常的自動翻譯,如異常翻譯中所述。

  @Service注解一般使用在Service層。

  @Controller注解一般使用在Controller層的類,@RestController繼承了@Controller。

  @Configuration注解一般用來配置類,用來項目啟動時加載的類。

 

2、@ComponentScan

  @ComponentScan注解一般用在Spring項目的核心配置類,或者在Spring Boot項目的啟動類里使用。作用就是用來掃描@Component及其子類注釋的類,用於Spring容器自動裝配。@ComponentScan默認是掃描的路徑是同級路徑及同級路徑的子目錄,所以把Spring Boot的啟動類放在根目錄下,@ComponentScan是可以省略不寫的。

  @ComponentScan的主要屬性如下:

2.1 value屬性、basePackages屬性

 源碼如下:

@AliasFor("basePackages")
String[] value() default {};

@AliasFor("value")
String[] basePackages() default {};

  這兩個值的作用是一樣的,是相互別名的關系。內容是填寫要掃描的路徑,如果是有一個路徑,可以不用寫value,有幾種寫法如下:

@ComponentScan("com.zh.service")

@ComponentScan(value = "com.zh.service")

@ComponentScan(value = {"com.zh.dao", "com.zh.service"})

 

2.2 includeFilters屬性、excludeFilters屬性

  這兩個的作用都是過濾器,excludeFilters的作用是剔除values屬性內的個別不需要加載的類,而includeFilters一般是和excludeFilters配合使用,就是被excludeFilters剔除的類里面,還需要其中的幾個類,就用includeFilters再加上。

  舉個例子,假設送了excludeFilters剔除了所有注解是Repository的類,但其中一個Stub開頭的類,還要用到,就可以按下面的例子這樣寫。

源碼如下:

    ComponentScan.Filter[] includeFilters() default {};

    ComponentScan.Filter[] excludeFilters() default {};

Filter作為過濾器的基本對象,的源碼如下:

@Retention(RetentionPolicy.RUNTIME)
@Target({})
public @interface Filter {
    FilterType type() default FilterType.ANNOTATION;

    @AliasFor("classes")
    Class<?>[] value() default {};

@AliasFor(
"value") Class<?>[] classes() default {};
String[] pattern()
default {}; }

FilterType是過濾器的類型,定義方式有幾種,源碼如下:

public enum FilterType {
    ANNOTATION,
    ASSIGNABLE_TYPE,
    ASPECTJ,
    REGEX,
    CUSTOM;

    private FilterType() {
    }
}

這幾種類型,把官網上的內容翻譯寫一下,大概的描述就這樣的:

 

我們分別舉個例子:

// 正則表達式、默認
@Configuration
@ComponentScan(basePackages = "org.example",
        includeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = ".*Stub.*Repository"),
        excludeFilters = @ComponentScan.Filter(Repository.class))
public class AppConfig {
    ...
}

// 可分配的,直接指定類路徑
@ComponentScan(basePackages = "org.example",
  excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, pattern = {"org.example.SomeClass"}))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM