一、启动流程
0、构造
1 | public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { |
- META-INF/spring.factories
1 | # Initializers |
1 | SpringApplication#getSpringFactoriesInstances->SpringFactoriesLoader#loadSpringFactories |
1、getRunListeners
- 获取并启动监听器,用于监听SpringApplication运行过程
1 | SpringApplicationRunListeners listeners = getRunListeners(args); |
2、createApplicationContext
- 依据webApplicationType创建应用上下文
1 | switch (webApplicationType) { |
- 注册必须PostProcessor
1 | AnnotationConfigServletWebServerApplicationContext->AnnotatedBeanDefinitionReader-> |
1 | // 注册ConfigurationClassPostProcessor,处理@Configuration等注解 |
3、prepareContext
- 准备应用上下文,将启动类注册至BeanDefinition
1 | prepareContext->load->register->registerBean->doRegisterBean |
4、refreshContext
- 刷新应用上下文
1 | refreshContext->refresh |
- 调用工厂处理器处理启动类
1 | invokeBeanFactoryPostProcessors->invokeBeanDefinitionRegistryPostProcessors-> |
1 | // 处理@ComponentScan,默认扫描启动类所在包下所有class |
- 创建启动Web Server容器
1 | onRefresh->createWebServer->getWebServer->getTomcatWebServer->initialize->start |
- 实例化单例对象
1 | finishBeanFactoryInitialization->preInstantiateSingletons->getBean |
5、callRunners
- 调用Runner,执行自定义逻辑
1 | for (Object runner : new LinkedHashSet<>(runners)) { |
二、IOC
1、BeanDefinition
- 满足不同类型资源(XML、Annotation、Interface)加载,解析生成统一的Bean定义
1 | public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor |
2、BeanFactory
- 对容器中的Bean提供统一的管理和调用
1 | public interface BeanFactory { |
3、BeanRegistry
- 依据Bean的定义加载生成Bean实例,放置在统一的容器中
1 | public interface SingletonBeanRegistry { |
4、扫描流程
1 | doScan->findCandidateComponents->scanCandidateComponents->checkCandidate-> |
5、注册流程
1 | getBean->doGetBean->createBean->doCreateBean->createBeanInstance->populateBean-> |
6、循环依赖
1 | // 一级缓存:单例对象缓存池,完成实例化并且属性赋值的成熟对象 |
- 实例化后,放入三级缓存
- AbstractAutowireCapableBeanFactory#doCreateBean
1 | boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && |
- 三级缓存升级至二级缓存
- DefaultSingletonBeanRegistry#getSingleton
1 | protected Object getSingleton(String beanName, boolean allowEarlyReference) { |
- 二级缓存升级至一级缓存
- DefaultSingletonBeanRegistry#getSingleton
1 | if (newSingleton) { |
三、AOP
1、BeanPostProcessor
- 基于BeanPostProcessor实现用户自定义增强
1 | public interface BeanPostProcessor { |
2、调用过程
1 | initializeBean-> |
1 | if (targetClass.isInterface() || Proxy.isProxyClass(targetClass) || AopProxyUtils.isLambda(targetClass)) { |
3、对比
- JDK代理只能对实现接口的类生成代理,而CGLib通过继承类的实现方式对指定的类生成一个子类,并覆盖其中的方法,不能代理final修饰的类
- JDK代理使用的是反射机制实现aop的动态代理,CGLib代理使用字节码处理框架ASM,通过修改字节码生成子类。所以JDK动态代理的方式创建代理对象效率较高,执行效率较低,CGLib创建效率较低,执行效率高
四、MVC
1、Servlet
- DispatcherServlet本质上是一个Servlet,遵循相应规范
1 | public interface Servlet { |
2、声明注入
- 在spring-boot-autoconfigure模块下spring.factories文件中声明
1 | org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration |
1 | (name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME) |
- 在refreshContext阶段,createWebServer时进行依赖注入
3、初始化
- 由标识位指定,在首次请求时,会进行初始化操作
1 | if (!instanceInitialized) { |
- 初始化流程
1 | init->initServletBean->initWebApplicationContext->onRefresh->initStrategies |
1 | protected void initStrategies(ApplicationContext context) { |
4、工作流程
1 | doService->doDispatch->getHandler->getHandlerAdapter->applyPreHandle->handle-> |
5、HandlerMapping
- 实现类为RequestMappingHandlerMapping,在WebMvcAutoConfiguration中注入,实现了InitializingBean接口
1 | protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception { |
- 初始化流程
1 | afterPropertiesSet->initHandlerMethods->processCandidateBean->detectHandlerMethods-> |
- MappingRegistry
1 | class MappingRegistry { |
1 | public void register(T mapping, Object handler, Method method) {} |
6、HandlerMethodArgumentResolver
- 请求参数解析器
1 | public interface HandlerMethodArgumentResolver { |
- RequestParamMethodArgumentResolver、PathVariableMethodArgumentResolver、RequestResponseBodyMethodProcessor
7、HandlerMethodReturnValueHandler
- 返回值处理器
1 | public interface HandlerMethodReturnValueHandler { |
- RequestResponseBodyMethodProcessor
8、HandlerExceptionResolver
- 异常解析器
1 | public interface HandlerExceptionResolver { |
- ExceptionHandlerExceptionResolver