Springboot是Spring的脚手架,提供的自动配置功能初始化spring的ioc容器,
BeanDefinition:可以理解为定义bean
bean的生命周期,大部分初始化和赋值在AbstractAutowireCapableBeanFactory.doCreateBean 下来定义的:
- 创建bean
- 赋值和变量
- 初始化bean 包括 BeanPostProcessor,initMethod等
- AOP相关的内容
- 被销毁
SpringApplicationContext:Spring的容器负责放置初始化好的bean
SpringFactoriesLoader 加载 spring.factories
1. 生成一个SpringApplication的对象
- 1. webApplicationType = 推测web应用类型(NONE、REACTIVE、SERVLET)
- 2. 从spring.factories中获取BootstrapRegistryInitializer对象
- 3. initializers = 从spring.factories中获取ApplicationContextInitializer对象
- 4. listeners = 从spring.factories中获取ApplicationListener对象
2. SpringApplication的对象.run()
- 1. 获取SpringApplicationRunListener—->EventPublishingRunListener
- \2. SpringApplicationRunListener.starting()
- 3.创建一个Spring容器
- 4. ApplicationContextInitializer—>初始化Spring容器
- \5. SpringApplicationRunListener.contextPrepared()
- 6. 把传给run方法的配置类注册成为一个Bean
- \7. SpringApplicationRunListener.contextLoaded()
- 8.会解析配置类、扫描、启动Tomcat/Jetty/Undertow
- (AutoConfigurationImportSelector,DeferredImportSelector)
- \9. SpringApplicationRunListener.started() I
- 10.
- \10. SpringApplicationRunListener.ready()
从注解开始说
@enableSpringAutoConfig ->Configeration ->inportSelector-> AutoConfigurationImportSelector
@SpringBootConfig- mapperScan
@ComponentScan
autoConfigerationSelector.class 会解析 autoconfig包下面的bean.factory
从SpringBoot.run()说
SpringApplication.run()入口
AbstractApplicationContext.refresh()创建了ApplicationContext容器后刷新
DefaultListableBeanFactory,deGetBean() ApplicationContext集成了 ListableBeanFactory
DefaultSingletonBeanRgistry.getSingleton() 获取单例的bean实例
AbstractAutowireCapableBeanFactory.createBean();创建对应的bean对应上面的Bean的生命周期
newInstance() 初始化一个bean实例
在refresh()方法下对应的方法注释:
1 | public void refresh() throws BeansException, IllegalStateException { |
postProcessBeanFactory()
invokeBeanFactoryPostProcessors()
1 |
|
onRefresh();
1 | AbstractApplicationContext.onRefresh 是空但是AnnotationConfigServletWebServerApplicationContext是实际实现的类,下面有留言 |
/**
Create a new {@link AnnotationConfigServletWebServerApplicationContext} that needs
- to be populated through {@link #register} calls and then manually
- {@linkplain #refresh refreshed}.
*/
AnnotationConfigServletWebServerApplicationContext 继承了ServletWebServerApplicationContext 实现实现onRefresh的类是
实际会启动tomcat服务的
启动
在探究AOP原理之前,让我们先来了解AOP的术语:
Aspect(切面):要实现的散布应用中多处的功能,例如日志记录;
Joinpoint(连接点):应用执行中可以插入切面的点,这个点可以是方法调用、异常抛出甚至是字段值修改,由于Spring AOP构建在动态代理的基础上,所以连接点只支持方法层面;
Pointcut(切点):定义了切面应该插入到哪些连接点,我们并不希望切面插入到所有的连接点,切点能让我们决定切面应该插入到哪些连接点;
Weaving(织入):把切面插入到目标对象上并生成新的代理对象的过程。我们可以在目标对象的编译期(需要特殊的编译器)、类加载期(需要特殊的类加载器)或运行期织入,由于Spring AOP构建在动态代理的基础上,所以只支持在运行期织入;
Introduction(引入):为目标对象添加新方法或新属性的过程,引入使得在不改变目标对象的情况下,让目标对象具有新的行为和状态;
Advice(通知):定义了切面何时被触发,Spring目前有5种类型的通知,分别是:BeforeAdvice(前置通知)、AfterAdvice(后置通知)、AfterReturningAdvice(返回通知)、ThrowsAdvice(异常通知)和AroundAdvice(环绕通知)。
参考链接:聊透Spring bean的生命周期 - 掘金,Spring Boot详细生命周期介绍 - 知乎,Spring详细生命周期介绍 - 知乎,@Pointcut()的execution、@annotation等参数说明Normal Developer的博客-CSDN博客@annotation ,Spring IOC和Bean生命周期源码分析 ,Spring中Bean注入源码分析 - 掘金