1. 完整启动流程
flowchart TD
Start([应用启动入口<br/>SpringApplication.run]) --> CreateContext[创建Spring应用上下文<br/>ApplicationContext]
CreateContext --> ConfigPhase[配置阶段]
ConfigPhase --> LoadConfig[加载配置文件<br/>application.properties/yml]
LoadConfig --> ComponentScan[组件扫描<br/>@ComponentScan]
ComponentScan --> RegisterBean[注册BeanDefinition<br/>到BeanDefinitionRegistry]
RegisterBean --> BeanFactoryPost[BeanFactoryPostProcessor执行<br/>可修改BeanDefinition]
BeanFactoryPost --> InstantiationPhase[实例化阶段]
InstantiationPhase --> CreateBean[实例化Bean<br/>调用构造器]
CreateBean --> InjectDep[属性填充<br/>@Autowired依赖注入]
InjectDep --> AwareCallback[Aware接口回调<br/>BeanNameAware等]
AwareCallback --> BeanPostBefore[BeanPostProcessor<br/>前置处理]
BeanPostBefore --> InitMethod[初始化方法<br/>@PostConstruct]
InitMethod --> BeanPostAfter[BeanPostProcessor<br/>后置处理 AOP代理]
BeanPostAfter --> BeanReady[Bean就绪<br/>放入单例池]
BeanReady --> WebInit[Web容器初始化]
WebInit --> DispatcherInit[DispatcherServlet初始化]
DispatcherInit --> HandlerMapping[HandlerMapping初始化<br/>扫描@RequestMapping]
HandlerMapping --> HandlerAdapter[HandlerAdapter初始化]
HandlerAdapter --> ExceptionHandler[异常处理器初始化<br/>@ControllerAdvice]
ExceptionHandler --> TomcatStart[内嵌Tomcat启动<br/>监听端口8080]
TomcatStart --> AppReady[应用就绪<br/>ApplicationReadyEvent]
AppReady --> HandleRequest[处理HTTP请求]
style Start fill:#e1f5ff
style CreateContext fill:#fff4e6
style ConfigPhase fill:#e8f5e9
style InstantiationPhase fill:#fce4ec
style WebInit fill:#f3e5f5
style AppReady fill:#e0f2f1
style HandleRequest fill:#fff9c4
2. Bean生命周期详细流程
flowchart TD
Start([Bean生命周期开始]) --> Constructor[① 实例化<br/>调用构造器]
Constructor --> SetProperties[② 属性填充<br/>@Autowired注入依赖]
SetProperties --> BeanNameAware{实现了<br/>BeanNameAware?}
BeanNameAware -->|是| SetBeanName[setBeanName]
BeanNameAware -->|否| BeanFactoryAware
SetBeanName --> BeanFactoryAware
BeanFactoryAware{实现了<br/>BeanFactoryAware?}
BeanFactoryAware -->|是| SetBeanFactory[setBeanFactory]
BeanFactoryAware -->|否| AppContextAware
SetBeanFactory --> AppContextAware
AppContextAware{实现了<br/>ApplicationContextAware?}
AppContextAware -->|是| SetAppContext[setApplicationContext]
AppContextAware -->|否| PreInit
SetAppContext --> PreInit
PreInit[③ BeanPostProcessor<br/>postProcessBeforeInitialization] --> PostConstruct{有@PostConstruct<br/>方法?}
PostConstruct -->|是| CallPostConstruct[调用@PostConstruct方法]
PostConstruct -->|否| InitializingBean
CallPostConstruct --> InitializingBean
InitializingBean{实现了<br/>InitializingBean?}
InitializingBean -->|是| AfterPropertiesSet[afterPropertiesSet]
InitializingBean -->|否| CustomInit
AfterPropertiesSet --> CustomInit
CustomInit{有自定义<br/>init-method?}
CustomInit -->|是| CallInitMethod[调用init-method]
CustomInit -->|否| PostInit
CallInitMethod --> PostInit
PostInit[④ BeanPostProcessor<br/>postProcessAfterInitialization<br/>AOP代理创建] --> Ready[⑤ Bean就绪<br/>可以使用]
Ready --> Usage[Bean被使用中...]
Usage --> Shutdown{应用关闭?}
Shutdown -->|否| Usage
Shutdown -->|是| Destroy[销毁流程开始]
Destroy --> PreDestroy{有@PreDestroy<br/>方法?}
PreDestroy -->|是| CallPreDestroy[调用@PreDestroy方法]
PreDestroy -->|否| DisposableBean
CallPreDestroy --> DisposableBean
DisposableBean{实现了<br/>DisposableBean?}
DisposableBean -->|是| CallDestroy[destroy方法]
DisposableBean -->|否| CustomDestroy
CallDestroy --> CustomDestroy
CustomDestroy{有自定义<br/>destroy-method?}
CustomDestroy -->|是| CallDestroyMethod[调用destroy-method]
CustomDestroy -->|否| End
CallDestroyMethod --> End([Bean销毁完成])
style Start fill:#e1f5ff
style Constructor fill:#fff4e6
style SetProperties fill:#e8f5e9
style Ready fill:#c8e6c9
style Usage fill:#fff9c4
style Destroy fill:#ffccbc
style End fill:#cfd8dc
3. HTTP请求处理流程
flowchart TD
Client[浏览器/客户端] -->|HTTP Request| Tomcat[Tomcat接收请求]
Tomcat --> Dispatcher[DispatcherServlet<br/>doDispatch方法]
Dispatcher --> FindHandler[HandlerMapping<br/>查找处理器]
FindHandler --> MatchURL{匹配到<br/>@RequestMapping?}
MatchURL -->|是| GetChain[获取HandlerExecutionChain]
MatchURL -->|否| NotFound[返回404]
GetChain --> PreHandle[拦截器前置处理<br/>Interceptor.preHandle]
PreHandle --> PreSuccess{前置处理<br/>成功?}
PreSuccess -->|否| InterceptorFail[返回错误]
PreSuccess -->|是| Adapter[HandlerAdapter<br/>调用Controller]
Adapter --> ParseParam[参数解析<br/>@RequestParam/@RequestBody]
ParseParam --> Validate{需要<br/>@Validated?}
Validate -->|是| DoValidate[执行参数校验]
Validate -->|否| InvokeController
DoValidate --> ValidResult{校验通过?}
ValidResult -->|否| ValidError[抛出校验异常]
ValidResult -->|是| InvokeController
InvokeController[调用Controller方法] --> CallService[Controller调用Service]
CallService --> ServiceLogic[Service执行业务逻辑<br/>单例Bean实例]
ServiceLogic --> CallRepo[Service调用Repository]
CallRepo --> DBAccess[访问数据库]
DBAccess --> ReturnData[返回数据]
ReturnData --> PostHandle[拦截器后置处理<br/>Interceptor.postHandle]
PostHandle --> ProcessResult{返回类型?}
ProcessResult -->|@ResponseBody| JsonConvert[HttpMessageConverter<br/>序列化为JSON]
ProcessResult -->|View| ViewRender[视图渲染]
JsonConvert --> AfterCompletion
ViewRender --> AfterCompletion
AfterCompletion[拦截器完成处理<br/>Interceptor.afterCompletion] --> Response[返回HTTP Response]
Response --> Client
ValidError --> ExceptionHandle[全局异常处理<br/>@ExceptionHandler]
InterceptorFail --> ExceptionHandle
ExceptionHandle --> ErrorResponse[返回错误响应]
ErrorResponse --> Client
style Client fill:#e1f5ff
style Dispatcher fill:#fff4e6
style InvokeController fill:#e8f5e9
style ServiceLogic fill:#fce4ec
style DBAccess fill:#f3e5f5
style Response fill:#c8e6c9
style ExceptionHandle fill:#ffccbc
4. 注解处理时序图
sequenceDiagram
participant Main as 启动类Main方法
participant Spring as SpringApplication
participant Context as ApplicationContext
participant Scanner as ComponentScanner
participant Registry as BeanDefinitionRegistry
participant Factory as BeanFactory
participant Bean as Bean实例
Main->>Spring: run(Application.class)
activate Spring
Spring->>Context: 创建上下文
activate Context
Context->>Scanner: 扫描@ComponentScan包
activate Scanner
Scanner->>Scanner: 查找@Component/@Service<br/>@Repository/@Controller
Scanner->>Registry: 注册BeanDefinition
activate Registry
Registry-->>Scanner: 注册完成
deactivate Registry
Scanner-->>Context: 扫描完成
deactivate Scanner
Context->>Factory: 实例化Bean
activate Factory
Factory->>Bean: new 构造器()
activate Bean
Bean-->>Factory: Bean实例
Factory->>Bean: @Autowired注入依赖
Factory->>Bean: @PostConstruct初始化
Bean-->>Factory: Bean就绪
deactivate Bean
Factory-->>Context: 所有Bean就绪
deactivate Factory
Context->>Context: 初始化Web容器
Context->>Context: 注册@RequestMapping
Context->>Context: 启动Tomcat
Context-->>Spring: 启动完成
deactivate Context
Spring-->>Main: 返回ApplicationContext
deactivate Spring
Note over Main,Bean: 应用就绪,可以处理请求
5. 依赖注入流程
flowchart TD
Start([应用启动]) --> ScanBeans[扫描并注册所有Bean定义]
ScanBeans --> BuildGraph[构建Bean依赖图]
BuildGraph --> CheckCircular{检测循环依赖}
CheckCircular -->|有循环| HandleCircular[尝试处理<br/>使用三级缓存]
CheckCircular -->|无循环| SortBeans
HandleCircular --> CanResolve{可以解决?}
CanResolve -->|是| SortBeans[拓扑排序<br/>确定创建顺序]
CanResolve -->|否| ThrowError[抛出循环依赖异常]
SortBeans --> CreateLoop{遍历<br/>所有Bean}
CreateLoop -->|下一个Bean| GetDefinition[获取BeanDefinition]
GetDefinition --> CheckScope{作用域?}
CheckScope -->|singleton| CheckExist{已创建?}
CheckScope -->|prototype| CreateNew[创建新实例]
CheckScope -->|request/session| CreateScoped[创建作用域实例]
CheckExist -->|是| GetFromCache[从缓存获取]
CheckExist -->|否| CreateSingleton[创建单例实例]
CreateSingleton --> Constructor[调用构造器]
CreateNew --> Constructor
CreateScoped --> Constructor
Constructor --> FindDeps{需要注入依赖?}
FindDeps -->|是| GetDeps[获取依赖Bean]
FindDeps -->|否| InitBean
GetDeps --> DepReady{依赖Bean<br/>已就绪?}
DepReady -->|是| InjectDeps[注入依赖]
DepReady -->|否| CreateDeps[递归创建依赖Bean]
CreateDeps --> InjectDeps
InjectDeps --> InitBean[初始化Bean]
InitBean --> CheckScope2{作用域?}
CheckScope2 -->|singleton| PutCache[放入单例缓存]
CheckScope2 -->|其他| Skip[跳过缓存]
PutCache --> CreateLoop
Skip --> CreateLoop
GetFromCache --> CreateLoop
CreateLoop -->|完成| AllReady[所有Bean就绪]
style Start fill:#e1f5ff
style BuildGraph fill:#fff4e6
style CheckCircular fill:#ffccbc
style CreateLoop fill:#e8f5e9
style AllReady fill:#c8e6c9
style ThrowError fill:#f44336,color:#fff
6. AOP代理创建流程
flowchart TD
Start([Bean初始化完成]) --> PostProcessor[BeanPostProcessor<br/>后置处理器]
PostProcessor --> CheckAOP{需要AOP增强?<br/>有@Transactional<br/>@Async等}
CheckAOP -->|否| ReturnOriginal[返回原始Bean]
CheckAOP -->|是| ChooseProxy{选择代理方式}
ChooseProxy -->|有接口| JDKProxy[JDK动态代理<br/>基于接口]
ChooseProxy -->|无接口/强制CGLIB| CGLIBProxy[CGLIB代理<br/>基于子类]
JDKProxy --> CreateHandler[创建InvocationHandler]
CGLIBProxy --> CreateCallback[创建MethodInterceptor]
CreateHandler --> WrapAdvice[包装增强逻辑<br/>before/after/around]
CreateCallback --> WrapAdvice
WrapAdvice --> GenerateProxy[生成代理对象]
GenerateProxy --> ReturnProxy[返回代理Bean]
ReturnProxy --> Usage[Bean被使用]
Usage --> MethodCall{调用方法}
MethodCall --> IsProxy{是代理对象?}
IsProxy -->|否| DirectCall[直接调用原始方法]
IsProxy -->|是| ProxyIntercept[代理拦截]
ProxyIntercept --> BeforeAdvice[执行前置增强<br/>如事务开启]
BeforeAdvice --> InvokeTarget[调用目标方法]
InvokeTarget --> CheckException{抛出异常?}
CheckException -->|是| AfterThrowing[执行异常增强<br/>如事务回滚]
CheckException -->|否| AfterReturning[执行返回增强]
AfterThrowing --> AfterAdvice[执行后置增强<br/>如事务关闭]
AfterReturning --> AfterAdvice
AfterAdvice --> Return[返回结果]
DirectCall --> Return
style Start fill:#e1f5ff
style CheckAOP fill:#fff4e6
style GenerateProxy fill:#e8f5e9
style ProxyIntercept fill:#fce4ec
style BeforeAdvice fill:#f3e5f5
style AfterAdvice fill:#ffe0b2
style Return fill:#c8e6c9
7. 启动优化关键点
mindmap
root((Spring Boot<br/>启动优化))
配置加载优化
减少@ComponentScan范围
排除不需要的AutoConfiguration
使用spring.factories精准加载
配置文件分环境加载
Bean创建优化
使用@Lazy延迟初始化
减少不必要的Bean
合并重复Bean定义
优化Bean依赖关系
AOP优化
避免滥用@Transactional
合理使用@Async
减少切面数量
优化切点表达式
类加载优化
减少依赖jar包
排除冲突依赖
使用Jar瘦身
开启Class Data Sharing
Web容器优化
调整Tomcat线程池
优化连接器配置
减少Filter数量
优化静态资源处理