@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 {};
}
}
关注微信公众号(程序员小兔)不定期分享技术