版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hbtj_1216/article/details/84901192
1 简介
在SpringBoot
的启动类里,默认使用了一个注解@SpringBootApplication
:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication
源码如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
@AliasFor(annotation = EnableAutoConfiguration.class)
Class<?>[] exclude() default {};
@AliasFor(annotation = EnableAutoConfiguration.class)
String[] excludeName() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanBasePackages() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
Class<?>[] scanBasePackageClasses() default {};
}
可以看出,@SpringBootApplication
一个注解整合了三个注解的功能:
@Configuration
@EnableAutoConfiguration
@ComponentScan
注意,@Configuration
在@SpringBootConfiguration
里面:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
因此,可以使用这三个注解替换@SpringBootApplication
,能够达到同样的效果:
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2 三个重要注解
2.1 @Configuration
在SpringBoot
中,被@Configuration
注解的类是一个配置类,相当于Spring
中的xml
配置文件。
2.2 @EnableAutoConfiguration
@EnableAutoConfiguration
借助@Import
注解使用AutoConfigurationImportSelector
将所有符合自动配置条件的bean
定义加载到Spring
的IoC
容器中。
源码如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
2.3 @ComponentScan
@ComponentScan
的作用是开启Spring
的自定扫描功能,将范围内被@Component
注解的类加载到容器中,并生成bean
。可以通过basePackages
等属性指定自动扫描的范围。如果不指定,则默认是从被@ComponentScan
注解的类所在的package
进行扫描,因此SpringBoot
的启动类最好放在项目的root package
下面,这样才能保证整个项目下的所有类都在扫描范围中。
3 @SpringBootApplication的4个属性
@SpringBootApplication
注解提供了4个属性可供配置:
exclude
—— 根据Class
对象来排除特定的类,不加入到Spring
容器中,传入Class
数组。excludeName
—— 根据类名来排除特定的类,不加入到Spring
容器中,传入参数是类的全限定名数组。scanBasePackages
—— 指定自动扫描的包,参数是字符串数组。scanBasePackageClasses
—— 指定自动扫描的包,参数是Class
对象数组。