springboot启动原理及其流程
springboot启动原理精简版
spring,springMVC和spring有什么区别?
⼀ springboot启动流程及其相关流程概览。
⼆ springboot的启动类⼊⼝
三 springbootApplication接⼝核⼼注解
1)@SpringBootConfiguration注解
2)@ComponentScan注解
3)@EnableAutoCOnfiguration
@AutoCOnfigurationPackage
@import(AutoconfigurationImportSelector.class)注解
springfactoriesLoader详解
四 springboot启动流程概览图
五 深⼊探索springapplication执⾏流程
简单了解bean的⽣命周期
beanFactory和ApplicationContext的区别
SpringMVC处理请求的流程
BeanFactory和FactoryBean的区别与联系
bean的循环依赖
@Import注解介绍
同⼀个类中调⽤@Transaction注解的⽅法会有事物效果吗?
来源
springboot启动原理精简版
wwwblogs/theRhyme/p/how-does-springboot-start.html
Spring Boot、Spring MVC 和 Spring 有什么区别?
分别描述各⾃的特征:
Spring框架就像⼀个家族,有众多衍⽣产品例如boot,security,jpa等等;但他们的基础都是spring的ioc和aop,ioc提供依赖注⼊的容器,aop解决了⾯向切⾯⼯程,然后在此两者的基础上实现了其他衍⽣产品的⾼级功能。
SpringMVC提供了⼀种轻度耦合的⽅式来开发web应⽤;它是spring的⼀个模块,是⼀个web框架;通过
DispatchServlet,ModelAndView和ViewResolver,开发web应⽤变得很容易;解决的问题领域是⽹站应⽤程序和服务开发-URL路由,Session,模板引擎,静态web资源等等。
SpringBoot实现了Auto-configuration⾃动配置(另外三⼤神器actuator监控,cli命令⾏接⼝,starter依赖),降低了项⽬搭建的复杂度。它主要是为了解决spring框架需要进⾏⼤量配置的问题。所以它并
不是替代spring的解决⽅案,⽽是和spring框架紧密结合⽤于提升spring开发者体验的⼯具;同时,它集成了⼤量常⽤的第三⽅库的配置(例如Jackson,JDBC,Mongo,Redis,Mail等等)。springboot应⽤这种这些第三⽅库⼏乎可以零配置开箱(out - of -the -box)
spring ioc注解
所以,⽤最简练的语⾔概括就是:
Spring是⼀个“引擎”
SpringMVC是基于Spring的MVC框架
springboot是基于spring4的条件注册的⼀个快速开发整合包。
⼀ springboot启动原理及相关流程概览)
springboot是基于spring的新型轻量级框架,最厉害的当属⾃动配置。我们可以根据启动流程和相关配置来看看如何实现⾃动配置
⼆ SpringBoot的启动类⼊⼝
⽤过springboot的开发⼈员会直观的感觉到两者的区别,springboot有⾃⼰的启动类(独⽴程序)
@SpringBootApplication
public class Application {
public static void main(String[] args){
SpringApplication.run(Application.class, args);
}
}
由代码我们不熟悉的地⽅就是springbootAppliction注解和SpringApplication.run(application.class,args)从这两⽅⾯⼊⼿。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)})
public@interface SpringBootApplication {
...
} 
核⼼三个注解:
1)@SpringbootConfiguration //继承了configuration,表⽰当前是注解类
2)@ComponentScan (excludeFilters = { // 扫描路径设置(具体使⽤待确认)
3)EnableAutoConfiguration //开启springboot的注解功能,springboot四⼤神器之⼀,其借助了@import功能接下来⼀⼀对其详解,增强对springbootApplication的理解
1)@Configuration注解
按照原来xml配置⽂件的形式,在springboot中我们⼤多⽤配置类来解决配置问题
配置bean⽅式的不同:
a)xml配置⽂件的形式配置bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xsi="/2001/XMLSchema-instance"
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)@Configuration注解
作⽤: a)对应xml配置中元素;
b) (重点)ComponentScan的功能其实就是⾃动扫描并加载符合条件的组件(⽐如@Component,@controller)或者bean定义
c) 将这些bean定义加载到IOC容器中
我们可以从basePackages等属性来细粒度的定制@Component⾃动扫描的范围,如果不指定,则默认spring框架实现会从声明
@ComponentScan所在类的package进⾏扫描。
注:所以springboot的启动类放在root package下,因为i默认不指定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)【重点注解】
当然还有其中⽐较重要的⼀个类就是:AutoConfigurationImportSelector.class
  AutoConfigurationPackage注解:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public@interface AutoConfigurationPackage {
}
通过@Import(AutoConfigurationPackages.Registrar.class)
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata,
BeanDefinitionRegistry registry){
register(registry,new PackageImport(metadata).getPackageName());
}
……
}