文章目录
主程序类,主入口类
/*** @apiNote 来标注一个主程序类,说明这是一个Spring Boot应用*/
@SpringBootApplication
public class SpringBootPracticeApplication {
public static void main(String[] args) {
//Spring应用启动起来
SpringApplication.run(SpringBootPracticeApplication.class,args);
}
}
@SpringBootApplication作用
标注在某个类上,说明这个类是SpringBoot的主配置类,SpringBoot项目就应该运行这个类的main方法来启动SpringBoot应用。进入这个注解:可以看到上面还有很多其他注解!
@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 {
//....................
}
@ComponentScan
这个注解在Spring中很重要,它对应XML配置中的元素。
作用:自动扫描包(扫描当前主启动类同级的包)并加载符合条件的组件或者bean,将这个bean定义加载到IOC容器中。
@SpringBootConfiguration
作用:SpringBoot的配置类,标注在某个类上,表示这是一个SpringBoot的配置类。
我们继续进去这个注解查看
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {}
@Configuration
这里的@Configuration,说明这是一个配置类,配置类就是对应Spring的xml配置文件。
再往里看
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {}
@Component
里面的@Component说明,启动类本身也是Spring中的一个组件而已,负责启动应用!
我们回到 SpringBootApplication 注解中继续看。
@EnableAutoConfiguration
开启自动配置功能
以前我们需要自己配置的东西,现在SpringBoot可以自动帮助我们配置;
@EnableAutoConfiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效;
点进注解接续查看:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
//....................
}
@AutoConfigurationPackage
自动配置包
再点进去查看:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
//..............
}
@import
(自动注册包和@ComponentScan自动扫描包,是联动的)Spring底层注解@import,给容器中导入一个组件。
Registrar.class 作用:将主启动类所在包及包下面所有子包里面的所有组件扫描到Spring容器;
这个分析完了,退到上一步,继续看。
@Import({AutoConfigurationImportSelector.class})
@Import({AutoConfigurationImportSelector.class})
给容器导入组件;
AutoConfigurationImportSelector: 自动配置导入选择器,那么它会导入哪些组件的选择器呢?我们点击去看这个类的源码。
省略…
思考:这么多自动配置为什么有的没有生效,需要导入对应的start才能有作用!
通过核心注解:@ConditionalOnxxx:如果这里边的条件都满足,才会生效。
我们在上面的自动配置类随便找一个打开看看,比如 :WebMvcAutoConfiguration
可以看到这些一个个的都是JavaConfig配置类,而且都注入了一些Bean,可以找一些自己认识的类,看着熟悉一下!
所以自动配置真正的实现是从classpath中搜寻所有的META-INF/spring.factories配置文件 ,并将其中对应的 org.springframework.boot.autoconfigure. 包下的配置项。但是不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们自动装配才会生效。
通过反射实例化为对应标注了 @Configuration的JavaConfig形式的IOC容器配置类,然后将这些都汇总成为一个实例并加载到IOC容器中。