SpringBoot启动流程及其原理
Spring Boot、Spring MVC 和 Spring 有什么区别?
分别描述各⾃的特征:
Spring 框架就像⼀个家族,有众多衍⽣产品例如 boot、security、jpa等等;但他们的基础都是Spring 的ioc和 aop,ioc 提供了依赖注⼊的容器, aop解决了⾯向切⾯编程,然后在此两者的基础上实现了其他延伸产品的⾼级功能。
Spring MVC提供了⼀种轻度耦合的⽅式来开发web应⽤;它是Spring的⼀个模块,是⼀个web框架;通过DispatcherServlet, ModelAndView 和 View Resolver,开发web应⽤变得很容易;解决的问题领域是⽹站应⽤程序或者服务开发——URL路由、Session、模板引擎、静态Web资源等等。
Spring Boot实现了auto-configuration⾃动配置(另外三⼤神器actuator监控,cli命令⾏接⼝,starter依赖),降低了项⽬搭建的复杂度。它主要是为了解决使⽤Spring框架需要进⾏⼤量的配置太⿇烦的问题,所以它并不是⽤来替代Spring的解决⽅案,⽽是和Spring框架紧密结合⽤于提升Spring开发者体验的⼯具;同时它集成了⼤量常⽤的第三⽅库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应⽤中这些第三⽅库⼏乎可以零配置的开箱即⽤(out-of-the-box)。
所以,⽤最简练的语⾔概括就是:
Spring 是⼀个“引擎”;
Spring MVC 是基于Spring的⼀个 MVC 框架;
Spring Boot 是基于Spring4的条件注册的⼀套快速开发整合包。
⼀ springboot启动原理及相关流程概览
  springboot是基于spring的新型的轻量级框架,最厉害的地⽅当属⾃动配置。那我们就可以根据启动流程和相关原理来看看,如何实现传奇的⾃动配置。
⼆  springboot的启动类⼊⼝
⽤过springboot的技术⼈员很显⽽易见的两者之间的差别就是视觉上很直观的:springboot有⾃⼰独⽴的启动类(独⽴程序)
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
从上⾯代码可以看出,Annotation定义(@SpringBootApplication)和类定义(SpringApplication.run)最为耀眼,所以要揭开SpringBoot的神秘⾯纱,我们要从这两位开始就可以了。
三单单是SpringBootApplication接⼝⽤到了这些注解
@Target(ElementType.TYPE) // 注解的适⽤范围,其中TYPE⽤于描述类、接⼝(包括包注解类型)或enum声明
@Retention(RetentionPolicy.RUNTIME) // 注解的⽣命周期,保留到class⽂件中(三个⽣命周期)
@Documented // 表明这个注解应该被javadoc记录
@Inherited // ⼦类可以继承该注解
@SpringBootConfiguration // 继承了Configuration,表⽰当前是注解类
@EnableAutoConfiguration // 开启springboot的注解功能,springboot的四⼤神器之⼀,其借助@import的帮助
@ComponentScan(excludeFilters = { // 扫描路径设置(具体使⽤待确认)
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
spring ioc注解
public @interface SpringBootApplication {
...
在其中⽐较重要的有三个注解,分别是:
  1)@SpringBootConfiguration // 继承了Configuration,表⽰当前是注解类
  2)@EnableAutoConfiguration // 开启springboot的注解功能,springboot的四⼤神器之⼀,其借助@import的帮助  3)@ComponentScan(excludeFilters = { // 扫描路径设置(具体使⽤待确认)
  接下来对三个注解⼀⼀详解,增加对springbootApplication的理解:
  1)@Configuration注解
  按照原来xml配置⽂件的形式,在springboot中我们⼤多⽤配置类来解决配置问题
   配置bean⽅式的不同: 
    a)xml配置⽂件的形式配置bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-3.0.xsd" default-lazy-init="true">
<!--bean定义-->
</beans>
  b)java configuration的配置形式配置bean
@Configuration
public class MockConfiguration{
//bean定义
}
  注⼊bean⽅式的不同:
    a)xml配置⽂件的形式注⼊bean
<bean id="mockService" class="..MockServiceImpl">
...
</bean>
  b)java configuration的配置形式注⼊bean
@Configuration
public class MockConfiguration{
@Bean
public MockService mockService(){
return new MockServiceImpl();
}
}
任何⼀个标注了@Bean的⽅法,其返回值将作为⼀个bean定义注册到Spring的IoC容器,⽅法名将默认成该bean定义的id。
  表达bean之间依赖关系的不同:
    a)xml配置⽂件的形式表达依赖关系
<bean id="mockService" class="..MockServiceImpl">
  <propery name ="dependencyService" ref="dependencyService" />
</bean>
<bean id="dependencyService" class="DependencyServiceImpl"></bean>
    b)java configuration配置的形式表达依赖关系(重点)
    如果⼀个bean A的定义依赖其他bean B,则直接调⽤对应的JavaConfig类中依赖bean B的创建⽅法就可以了。
@Configuration
public class MockConfiguration{
  @Bean
  public MockService mockService(){
  return new MockServiceImpl(dependencyService());
  }
  @Bean
  public DependencyService dependencyService(){
  return new DependencyServiceImpl();
  }
}
  2)@ComponentScan注解
  作⽤:a)对应xml配置中的元素;
     b) (重点)ComponentScan的功能其实就是⾃动扫描并加载符合条件的组件(⽐如@Component和@Repository等)或者bean定义;
     c) 将这些bean定义加载到IoC容器中.
  我们可以通过basePackages等属性来细粒度的定制@ComponentScan⾃动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进⾏扫描。
  注:所以SpringBoot的启动类最好是放在root package下,因为默认不指定basePackages
3) @EnableAutoConfiguration
    此注解顾名思义是可以⾃动配置,所以应该是springboot中最为重要的注解。
    在spring框架中就提供了各种以@Enable开头的注解,例如: @EnableScheduling、@EnableCaching、
@EnableMBeanExport等; @EnableAutoConfiguration的理念和做事⽅式其实⼀脉相承简单概括⼀下就是,借助@Import的⽀持,收集和注册特定场景相关的bean定义。 
  @EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加载到IoC容器【定时任务、时间调度任务】  @EnableMBeanExport是通过@Import将JMX相关的bean定义加载到IoC容器【监控JVM运⾏时状态】
    @EnableAutoConfiguration也是借助@Import的帮助,将所有符合⾃动配置条件的bean定义加载到IoC容器。
     @EnableAutoConfiguration作为⼀个复合Annotation,其⾃⾝定义关键信息如下:
@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage【重点注解】
@Import(AutoConfigurationImportSelector.class)【重点注解】
public @interface EnableAutoConfiguration {
...
}
其中最重要的两个注解已经标注:1、@AutoConfigurationPackage【重点注
解】2、@Import(AutoConfigurationImportSelector.class)【重点注解】
  当然还有其中⽐较重要的⼀个类就是:EnableAutoConfigurationImportSelector.class
AutoConfigurationPackage注解:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
}
通过@Import(AutoConfigurationPackages.Registrar.class)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。