Spring Boot程序有一个入口,就是main方法。main里面调用SpringApplication.run()启动整个Spring Boot程序,该方法所在类需要使用@SpringBootApplication注解。
@SpringBootApplication包括三个注解:
- @EnableAutoConfiguration:SpringBoot根据应用所声明的依赖来对Spring框架进行自动配置。简单概括一下就是,是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器。
- @Configuration:它就是JavaConfig形式的Spring Ioc容器的配置类。被标注的类等于在spring的XML配置文件中(applicationContext.xml),装配所有bean事务,提供了一个spring的上下文环境。
- @ComponentScan:组件扫描,可自动发现和装配Bean,功能其实就是自动扫描并加载符合条件的组件或者bean定义,最终将这些bean定义加载到IoC容器中。可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。默认扫描SpringApplication的run方法里的Booter.class所在的包路径下文件,所以最好将该启动类放到根包路径下。
springboot启动
SpringBoot启动的时候,不论调用什么方法,都会构造一个SpringApplication的实例,然后调用这个实例的run方法,这样就表示启动SpringBoot。
在run方法调用之前,也就是构造SpringApplication的时候会进行初始化的工作,初始化的时候会做以下几件事:
1.把参数sources设置到SpringApplication属性中,这个sources是object[],也就是说可以是任何类型的参数。
2.判断是否是web程序,这里判断是不是web开发环境也很简单,就是看类路径下是能加载到Servlet和ConfigurableWebApplicationContext这两个两类,
如果能加载到则是web环境,否则非web环境。
3.找出所有的应用程序监听器 。
SpringApplication实例化完成并且完成配置后调用run()方法,首先构造一个StopWatch对象,观察SpringApplication的执行 。得到初始化过程中加载的所有监听器,然后执行starting()方法,开始监听springApplication的启动.
加载Springboot配置环境,并将配置环境加入到监听器对象中
设置Banner的属性ConfigurableApplicationContext(应用配置上下文)创建,根据webApplicationType的类型来创建对应的contextClass,
通过扫描所有注解类来加载bean,最后通过BeanUtils实例化上下文对象,并返回.
prepareContext()方法会将listeners,environment等重要组件与上下文对象关联.
执行refreshContext()方法完成spring容器的刷新.
最后springboot做些收尾工作,启动完成.