我们开发任何一个Spring Boot项目,都会用到如下的启动类,从上面代码可以看出,Annotation定义(@SpringBootApplication)和类定义(SpringApplication.run)最为耀眼
1 | @SpringBootApplication |
@SpringBootApplication
1 | @Target(ElementType.TYPE) // 注解的适用范围,其中TYPE用于描述类、接口(包括包注解类型)或enum声明 |
重要的只有三个Annotation:
@Configuration(@SpringBootConfiguration点开查看发现里面还是应用了@Configuration)
@EnableAutoConfiguration
@ComponentScan
@Configuration
指示一个类声明一个或多个@Bean方法,并且可以由Spring容器处理。指示类为ioc容器配置类。
通常使用AnnotationConfigApplicationContext
或其支持Web变体AnnotationConfigWebApplicationContext
进行引导。
1 | AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); |
@ComponentScan
目的是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。
我们可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。
注:所以SpringBoot的启动类最好是放在root package下,因为默认不指定basePackages。
@EnableAutoConfiguration
帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot,并创建对应配置类的Bean,并把该Bean实体交给IoC容器进行管理。
1 | @SuppressWarnings("deprecation") |
最关键的要属@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。就像一只“八爪鱼”一样。
SpringApplication
执行流程大体如下:
- 信息收集:是否创建应用程序上下文(ApplicationContext)、有哪些上下文初始化器(ApplicationContextInitializer),有哪些应用监听器(ApplicationListener)
- 环境创建:包括配置要使用的PropertySource以及Profile,并调用监听器的environmentPrepared()方法进行告知。
- 应用程序上下文创建:创建ApplicationContext并调用初始化方法初始化,如contextPrepared()方法、contextLoaded()方法等
- 刷新应用程序上下文:调用refresh()方法进行刷新,并调用监听器finished()方法进行通知
版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接,感谢各位看官!!!
本文出自:monkeyGeek
座右铭:生于忧患,死于安乐
欢迎志同道合的朋友一起交流、探讨!
