现象
我们都知道,通过IDEA生成一个SpringBoot项目之后,运行包根路径下的XXXApplication类就能启动项目,并且通过localhost:8080端口就能访问我们的应用,不需要任何额外的配置!这相对于一个Spring项目,即使一个简单的功能都需要“大量”的配置来说,简直方便极了!
问题
那么问题来了,SpringBoot到底为我们做了哪些事情?
分析
首先我们生成一个SpringBoot项目,包下面会自动多了这样一个类:
@SpringBootApplication
public class HelloworldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloworldApplication.class, args);
}
}
这个类乍一看和一般的类没什么区别,除了头上多了个@SpringBootApplication注解,而关键就在于这个注解上,接下来我们看看这个注解为我们做了什么。
进入这个注解,我们看到:(这里我去除了一些不重要的代码,方便观看)
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan()
public @interface SpringBootApplication {}
@SpringBootApplication注解上有三个比较耀眼的注解,我们逐一看看这三个注解都做了什么:
- @SpringBootConfiguration
@Configuration
public @interface SpringBootConfiguration {}
这个注解实际的作用就是标明我们的启动类作为一个配置类
- @EnableAutoConfiguration
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
这个注解就比较重要了,看名字就是让SpringBoot自动为我们配置,那到底配置了什么呢,这个注解头上又有两个注解:
2.1 @AutoConfigurationPackage
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {}
我们看到这个注解为我们导入了一个类,我们进入这个类,并在139行打上断点,然后Debug启动项目:
这个类的作用就是,将启动类所在的包下的所有的类加入到Spring进行管理,如果我们将类定义在启动类所在的包之外,那么Spring容器是不能为我们管理这个类的(可以自行尝试)。
2.2 @Import(AutoConfigurationImportSelector.class) 这第二个注解又为我们导入了一个类AutoConfigurationImportSelector,我们进入这个类,并在443行打上断点,debug一下
我们会发现这个类会为我们导入很多xxxAutoConfiguration类,这些类就是SpringBoot为我们默认导入一些常用组件用的,如AOP、Jackson等,还有我们最熟悉的DispatcherServlet。
- ComponentScan这个注解就不多说了,就是进行一些组件的扫描。
以上就是对SpringBoot的一个初步分析。