1. 程式人生 > >Spring boot引入配置檔案

Spring boot引入配置檔案

@SpringBootApplication註解標註的類會預設以這個類為根目錄掃描下面的所有帶註解的類。那麼如果我們的類不想放在這個@SpringBootApplication註解標註的類為根目錄的類下面,而是放到其他路徑中,Spring boot預設是掃描不到的,這個時候就需要我們另外引入那些類才可以。Spring boot提供了2個註解給我們@Import和@ComponentScan

@Import原始碼如下,可以看到我們傳遞Class陣列,可以傳遞多個配置類,用在@SpringBootApplication註解的類中即可

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
    Class<?>[] value();
}

那麼對於@Import需要每個配置類都手動新增,所以可以使用@ComponentScan註解定義掃描規則,掃描指定的包路徑下的所有檔案。
@ComponentScan原始碼如下,可以看到除了指定掃描包之外,我們還可以另外定義其他屬性。例如:resourcePattern定義規則。includeFilters定義包含過濾器。excludeFilters定義不用包含的檔案過濾器等。
 

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
    @AliasFor("basePackages")
    String[] value() default {};

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

    Class<?>[] basePackageClasses() default {};

    Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;

    Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class;

    ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;

    String resourcePattern() default "*.class";

    boolean useDefaultFilters() default true;

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

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

    boolean lazyInit() default false;

    @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 {};
    }
}