springboot启动结构图:分为三部分
第一部分进行SpringApplication的初始化模块,配置一些基本的环境变量、资源、构造器、监听器,
第二部分实现了应用具体的启动方案,包括启动流程的监听模块、加载配置环境模块、及核心的创建上下文环境模块,
第三部分是自动化配置模块,该模块作为springboot自动配置核心
启动:
每个SpringBoot程序都有一个主入口,也就是main方法,main里面调用SpringApplication.run()启动整个spring-boot程序,该方法所在类需要使用@SpringBootApplication注解,以及@ImportResource注解(if need),@SpringBootApplication包括三个注解,功能如下:
@EnableAutoConfiguration:SpringBoot根据应用所声明的依赖来对Spring框架进行自动配置。
@SpringBootConfiguration(内部为@Configuration):被标注的类等于在spring的XML配置文件中(applicationContext.xml),装配所有bean事务,提供了一个spring的上下文环境。
@ComponentScan:组件扫描,可自动发现和装配Bean,默认扫描SpringApplication的run方法里的Booter.class所在的包路径下文件,所以最好将该启动类放到根包路径下。
SpringBoot我们都知道是由Pivotal团队开发的,创建的初始目的是为了简化spring的初始化的框架搭建和和开发过程。springboot使用了特定的方式来进行配置,我们不需要再使用样板化的配置。不仅简化了配置的复杂度,还能提高整体的开发效率。
SpringBoot:
他能独立的创建spring的应用程序,可以说是对spring的进一步封装。
他有内嵌的Tomcat,这样就不需要再部署war文件了,也就不需要在配置启动服务开关。
大大的简化了maven的配置,在使用spring的时候需要导入Tomcat的plugin,现在只需要导入springboot的依赖即可。
可以说是拿来即用,属于一种生产就绪的工具。
我们在开发任何一个springboot项目的时候,都会用到这样的启动类:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
在这个方法中最关注的就是springbootapplication和springapplication.run类。从他的annotation的定义中我们能发现,他其实组合型的注解。它里面定义多了注解。
@Target(ElementType.Type) //他是用来描述注解的适用范围,其中Type是用来描述类、接口、包括的注解的类型以及枚举的声明。
@Retention(RetentionPolicy.RUNTIME) //注解的生命周期,并且保留到class文件中(三个生命周期)
@Documented //表明这个注解应该被javadoc记录
@Inherited //子类可以继承该注解
@SpringBootConfiguration //继承了Configuration,表示当前是注解类
@EnableAutoConfiguration //开启springboot的注解功能,是springboot的四大神器之一,借助import的帮助
@ComponentScan(excludeFilters={ //扫描路径设置,具体路径待确认
})
这里定义了多个annotation进行了原信息的标注,但实际上只用了三个:
@Configuration(@SpringBootConfiguration点开其实还是应用了Configuration)
@EnableAutoConfiguration
@CompnentScan
如果使用这里的SpringBoot启动类,整个项目仍然与之前的项目启动功能相等:
@Configuration
@EnableAutoConfiguration
@ComponentScan
每次写这三个注解很辛苦,是由我们一般使用了@SpringBootApplication来替代它,使之用起来更方便。这里对这三个注解做一下介绍:
一、@Configuration:
这里的@Configuration相对来说并不陌生,因为他就是javaConfig(java配置形式)形式的Spring IOC容器配置类使用的Configuration。SpringBoot推荐使用基于JavaConfig的配置形式。因此这里的启动类标注了@Configuration之后,其本身就是一个IOC容器的配置类。
举一个简单的例子来回顾一下xml和config配置方式的区别:
1、表达形式层面
xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans
<!--bean定义-->
</beans>
基于javaconfig的配置:
@Confguration
public class MockConfiguration{
}
任何一种标注了@Configuration的Java类定义都是一个javaConfig配置类
2、注册bean定义的层面
基于xml的配置形式:
<bean id="mockService" class="..MockServiceImpl">
...
</bean>
基于Javaconfig的配置形式:
@Configuration
public class MockConfiguration{
@Bean
public MockService mockService(){
return new MockServiceImpl();
}
}
任何以一个标注@Bean的方法,其返回值将作为一个bean(实体类)定义注册到spring的IOC容器,方法名将默认成为该bean定义的ID。
3、表达依赖注入关系层面
为了表达bean于bean之间的依赖关系,我们在xml的配置是这样的:
<bean id="mockService" class="..MockServiceImpl">
2 <propery name ="dependencyService" ref="dependencyService" />
3 </bean>
4
5 <bean id="dependencyService" class="DependencyServiceImpl"></bean>
@基于javaConfgi的配置是这样的:
@Configuration
public class MockConfiguration{
@Bean
public MockService mockService(){
return new MockServiceImpl(dependencyService());
}
@Bean
public DependencyService dependencyService(){
return new DependencyServiceImpl();
}
}
这里如果一个bean的定义依赖于其他bean,那么直接调用对应的javaconfig中依赖于bean配置的方法即可
提到@Configuration就会想到他的搭档@Bean,使用这两个注解,可以创建一个简单的spring配置类,可以用来代替响应的xml配置文件。
<beans>
<bean id = "car" class="com.test.Car">
<property name="wheel" ref = "wheel"></property>
</bean>
<bean id = "wheel" class="com.test.Wheel"></bean>
</beans>
相当于:
@Configuration
public class Conf {
@Bean
public Car car() {
Car car = new Car();
car.setWheel(wheel());
return car;
}
@Bean
public Wheel wheel() {
return new Wheel();
}
}
@Configuration注解标识了注解可以使用spring IOC容易作为bean定义的来源
@bean注解告诉spring,该注解的方法将会返回一个对象,这个对象被注册为spring应用程序上下文中的bean
二、@ComponentScan
@ComponentScan在spring中很重要,对应着xml中的配置元素。它对应的功能就是自动扫描并加载符合条件的组件(如@Component和@Repository)或者bean定义。最终将这些bean定义加载到IOC容器中。
我可以通过basepackages属性来细粒度的定制扫描范围。如果不指定范围,就会扫描配置了@CompontentScan这个类所在的包空间。
所以springboot的启动类最好是放在rootpackage下面,这样就不用指定basepackage了。
三、@EnableAutoConfiguration
这个注解也是比较重要的。在spring框架中提供了各种以@Enable为开头的注解。如@EnableScheduling、@EnableCaching、@EnableMBeanExport等,他的做事方式一脉相承,借助@import来收集和注册特定场景下的相关bean的定义。
- @EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加载到IoC容器。
- @EnableMBeanExport是通过@Import将JMX相关的bean定义加载到IoC容器。
@EnableAutoConfiguration借助@Import的帮助将符合条件的bean定义加载到IOC容器。@EnableAutoConfiguration会根据类路径中的jar依赖为项目进行自动配置,如:添加了spring-boot-starter-web依赖,会自动添加Tomcat和Spring
MVC的依赖,Spring Boot会对Tomcat和Spring MVC进行自动配置。
如果面试使用可以直接背下来。