从上一篇文章中,我们可以看到SpringBoot应用程序的启动入口代码如下:
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
在这个启动类中,我们可以看到最耀眼的地方就是Annotation定义-@SpringBootApplication 和 启动方法SpringApplication.run,因此,要了解SpringBoot应用程序的启动原理,我们需要先从这两个地方入手。
一、@SpringBootApplication
我们按住ctrl点击@SpringBootApplication查看源码,可以看到@SpringBootApplication实际上是一个复合的Annotation:
@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 {
.....
}
从源码可以看到它的定义使用了多个的Annotation进行标注,但是事实上,对于SpringBoot来说,最重要的只有只有以下三个Annotation,所以说@SpringBootApplication是一个“三体”结构:
@SpringBootConfiguration
(这里的SpringBootConfiguration是2.0,1.0用的是@Configuration)
@EnableAutoConfiguration
@ComponentScan
因此如果我们自己创建如下启动类,加上以上三个主要的Annotation,我们的整个应用的启动依然与默认的启动类功能对等:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
显然,@SpringBootApplication 这样的一站式复合Annotation显得更加方便些。
@SpringBootConfiguration
这里的@SpringBootConfiguration实际上就是JavaConfig形式@Configuration, @Configuration从Spring3.0开始使用,用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
@EnableAutoConfiguration
@EnableAutoConfiguration与Spring框架中各种@Enable开头的Annotation定义的理念和做事方式其实一样的,借助@Import的支持,将所有符合自动配置条件的bean定义加载到IOC容器,仅此而已。
@ComponentScan
@ComponentScan其实很简单,其功能就是自动扫描并加载符合条件的组件或者Bean定义,最终将这些加载到容器中。
注:初学者,了解较少,如有错误之处,欢迎指出,感谢阅读!