基于springboot 2.1.3版本
首先看看springboot启动类代码:
@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 //申明是配置,里面就是@Configuration注解
@EnableAutoConfiguration //开启自动注入
@ComponentScan(excludeFilters = {
//包扫描
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
下面我们主要看看@ComponentScan和@EnableAutoConfiguration注解的源码
先看@ComponentScan,这个注解的作用就是指定当前应用所要扫描的包
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)//表示可以重复用这个注解,在一个类上可以加两个@ComponentScan注解,但是属性值肯定需要不同
public @interface ComponentScan {
下面就是重点
,@EnableAutoConfiguration注解
看源码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
里面的重点注解就两个
@AutoConfigurationPackage:用于导入并装配用户自定义类,即自动扫描包中的类
@Import(AutoConfigurationImportSelector.class):用于导入并装配框架本身的类
下面我们看@AutoConfigurationPackage:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME