一、前言

笔者之前学过android,里面一个activity有生命周期,这里的spring也有生命周期,好理解,好接受生命周期这个概念。

二、Spring生命周期,就是SmartLifeCycle

1、开始初始化容器

refresh()第五个方法,源码解析008 源码解析009

2、加载BeanFactoryPostProcessor实现类:对应源码:就是源码解析008的扫描
3、执行BeanFactoryPostProcessor的postProcessBeanFactory方法:执行这个方法源码解析008,源码解析008执行postProcessBeanFactory()方法,源码解析009执行postProcessBeanDefinitionRegistry()方法,这两个方法的执行是先后关系吗?

refresh()第六个方法,源码解析010

4、加载BeanPostProcessor实现类:在refresh()第六个方法里面,加载BeanPostProcessor实现类,在后面的refresh()第十一个方法,对于之前加载的BeanPostProcessor实现类,完成bean初始化之前和初始化之后的操作。

注意这里:
加载BeanFactoryPostProcessor实现类,这里的加载就是识别,被程序识别
执行BeanFactoryPostProcessor的postProcessBeanFactory方法,满足if (beanFactory instanceof BeanDefinitionRegistry) { ,可以执行postProcessBeanDefinitionRegistry()方法
加载BeanPostProcessor实现类,这里的加载是加入到springioc容器
第一个和第三个是加载,中间一个是执行方法

beanFactoryPostProcessor和beanPostProcesssor相同点,都是分类
在beanFactoryPostProcessor中,源码解析008 七个步骤,分类为
1、对于实现了BeanDefinitionRegistryPostProcessor接口的bean分为三类
所有实现了BeanDefinitionRegistryPostProcessor接口和PriorityOrdered接口的bean,执行invokeBeanDefinitionRegistryPostProcessors()
所有实现了BeanDefinitionRegistryPostProcessor接口和Ordered接口的bean,执行invokeBeanDefinitionRegistryPostProcessors()
实现了BeanDefinitionRegistryPostProcessor接口,但是没有实现PriorityOrdered和Ordered的bean,执行invokeBeanDefinitionRegistryPostProcessors()
2、对于实现了BeanFactoryPostProcessor接口的bean分为三类(剔除实现了BeanDefinitionRegistryPostProcessor接口的bean)
同时实现了BeanFactoryPostProcessor接口和PriorityOrdered接口的放入priorityOrderedPostProcessors,并执行invokeBeanFactoryPostProcessors()
同时实现了BeanFactoryPostProcessor接口和Ordered接口的放入orderedPostProcessorNames,并执行invokeBeanFactoryPostProcessors()
其他的,仅仅实现了BeanFactoryPostProcessor接口放入nonOrderedPostProcessorNames,并执行invokeBeanFactoryPostProcessors()
在beanPostProcesssor中,分为
priorityOrderedPostProcessors
orderedPostProcessors
nonOrderedPostProcessors
internalPostProcessors

beanFactoryPostProcessor和beanPostProcesssor区别,直接执行和等到bean初始化的时候再执行
beanFactoryPostProcessor在refresh()第5个方法是直接执行了invokeBeanDefinitionRegistryPostProcessors()和invokeBeanFactoryPostProcessors(),但是beanPostProcessor是在refresh()第六个方法注入到spring ioc容器,
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
registerBeanPostProcessors(beanFactory, orderedPostProcessors);
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
registerBeanPostProcessors(beanFactory, internalPostProcessors);
到第11个方法执行
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
result = beanProcessor.postProcessBeforeInitialization(result, beanName);
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
result = beanProcessor.postProcessAfterInitialization(result, beanName);

5、实例化业务bean:就是getBean()三步曲

小结:对于bean,实例化和初始化是不同的,
bean的实例化:创建bean实例newInstance,getBean()三步曲,第二步是属性注入invoke,第三步是bean初始化invoke,附:bean实例化和bean初始化分为,给三级缓存解决循环依赖提供了条件,good
bean的初始化:refresh()第11个方法中, invokeInitMethods(beanName, wrappedBean, mbd);

6、Aware接口族调用:

总述:Aware分为两种情况
1、ApplicationContext六个:对于环境、统一资源加载、容器事件机制、国际化、ApplicationContext本身 embededValueResolver六个Aware,在第三个方法prepareBeanFactory()里面调用。
对于每个bean后置处理器来说,它的postProcessBeforeInitialization方法会在每个bean的初始化之前被调用一次,就是在refresh()第三个方法prepareBeanFactory()方法中。
2、bean三个:对于BeanNameAware BeanClassLoaderAware BeanFactoryAwarer,在倒数第二个方法initializeBean()方法里面调用

倒数第2个方法,第11个方法

7、执行BeanPostProcessor实现类的postProcessBeforeInitialization方法:
8、执行InitializingBean实现类的afterPropertiesSet方法
9、执行bean的init-method属性指定的初始化方法
10、执行BeanPostProcessor实现类的postProcessAfterInitialization方法

从Spring生命周期出发..._其他

小结:对于bean,实例化和初始化是不同的,
bean的实例化:创建bean实例newInstance,getBean()三步曲,第二步是属性注入invoke,第三步是bean初始化invoke,附:bean实例化和bean初始化分为,给三级缓存解决循环依赖提供了条件,good
bean的初始化:refresh()第11个方法中, invokeInitMethods(beanName, wrappedBean, mbd);

11、初始化完成:refresh()第12个方法finishRefresh();

12、关闭容器,执行DiposibleBean实现类的destory
13、执行bean的destroy-method属性指定的初始化方法

三、Spring所有扩展点

1、Spring扩展点之BeanFactoryPostProcessor接口和BeanDifinitionRegistryPostProcessor接口 源码解析008 源码解析009 核心:七个方法 上面寿命周期2 3步骤

2、Spring扩展点之BeanPostProcessor接口 知道了 源码解析010
在refresh()第6个方法中加载,
在refresh()第11个方法中执行
上面生命周期4步骤

3、Spring扩展点之Aware接口族 分为两种情况 上面写了

总述:Aware分为两种情况
1、ApplicationContext六个:对于环境、统一资源加载、容器事件机制、国际化、ApplicationContext本身 embededValueResolver六个Aware,在第三个方法prepareBeanFactory()里面调用。
对于每个bean后置处理器来说,它的postProcessBeforeInitialization方法会在每个bean的初始化之前被调用一次,就是在refresh()第三个方法prepareBeanFactory()方法中。
2、bean三个:对于BeanNameAware BeanClassLoaderAware BeanFactoryAwarer,在倒数第二个方法initializeBean()方法里面调用

4、Spring扩展点之FactoryBean接口

5、Spring事件监听机制 refresh()最后一个方法广播消息,Spring四种事件

6、Spring @Import四种

四、面试金手指

4.1 BeanFactory和FactoryBean的区别

BeanFactory 和FactoryBean的区别
BeanFactory:以Factory结尾,表示它是一个工厂类,是用于dao管理Bean的一个工厂
FactoryBean:以Bean结尾,表示它是一个Bean,不同于普通Bean的是:它是实现了FactoryBean < T > 接口的Bean,根据该Bean的Id从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FactoryBean本身, 如果要获取FactoryBean对象,可以在id前面加一个&符号来获取。

4.2 四个概念:Spring、SpringMVC、SpringBoot、SpringCloud

4.2.1 起手式,四个概念 + 整个流程

介绍概念

Spring两大基础:ioc 和 aop;

ioc 提供了依赖注入的容器,aop 解决了面向横切面的编程。

SpringMVC 提供web开发方式

SpringBoot 不提供额外功能,只是提供一个快捷启动方式

附加:springboot 与 springcloud关系:
单体架构:springboot + mybatis
微服务架构:使用springcloud,其中每一个子项目是一个springboot
关系:springboot可以脱离springcloud单独使用,形成单体架构;但是,springcloud组件微服务架构的时候不能脱离springboot,每一个子项目必须是一个springboot项目。

一句话小结三个组件:

Spring 最初利用“工厂模式”( DI )和“代理模式”( AOP )解耦应用组件。大家觉得挺好用,于是按照这种模式搞了一个 MVC 框架(一些用 Spring 解耦的组件),用开发 web 应用( SpringMVC )。然后有发现每次开发都要搞很多依赖,写很多样板代码很麻烦,于是搞了一些懒人整合包( starter ),这套就是 Spring Boot 。

附加:springboot 与 springcloud关系:
单体架构:springboot + mybatis
微服务架构:使用springcloud,其中每一个子项目是一个springboot
关系:springboot可以脱离springcloud单独使用,形成单体架构;但是,springcloud组件微服务架构的时候不能脱离springboot,每一个子项目必须是一个springboot项目。

4.2.2 Spring(IOC + AOP,拉高逼格)

详细介绍IOC和AOP(五大部分、五种通知、两种代理)
spring的核心中IOC和AOP。
IOC就是控制反转(就是将原本由程序代码直接操作的对象的调用权交给容器),目的是为了减低计算机代码的耦合度,所谓的耦合度就是代码中的逻辑关系不要太紧密,避免后面改的人会因为不懂业务逻辑导致改错代码;除此之外也避免我们每次创建新的对象,减少对应的代码量。
我们实际代码过程中最常见的方式是依赖注入(DI Dependency Injection),所谓依赖注入就是通过构造注入或者set进行注入。依赖查找(DL Dependency Lookup)这是通过名称和类型查找bean。
AOP是面向切面编程,AOP分为五大部分:
(1)Aspect(切面):通常是一个独立的类,里面可以定义切入点和通知。
(2)JointPoint(连接点):程序执行中明确的点,一般是方法的调用。
(3)Advice(五种通知):AOP在特定的切入点上做出的增强处理,有before,after,afterRunning,afterThrowing,around五种通知;
(4)Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式;
(5)AOP代理(两种代理):AOP框架创建的对象,代理就是目标对象的加强,Spring的AOP可以使用JDK代理,也可以使用CGLIB代理,前者基于接口,后者是基于子类。
五种通知类型:
(1)Before:在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可。
(2)AfterReturning:在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值。
(3)AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名来访问目标方法中所抛出的异常对象。
(4)After:在目标方法完成之后做增强,无论目标方法时候成功完成。@After可以指定一个切入点表达式。
(5)Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint。

4.2.3 SpringMVC流程 (三个组件+流程图,拉高逼格)

Spring MVC提供了一种轻度耦合的方式来开发web应用,相对于单纯servlet 少了model中的映射。

Spring MVC是Spring的一个模块,是一个web框架。通过DispatcherServlet, ModelAndView 和 View Resolver(面试要抓住关键词),开发web应用变得很容易。解决的问题领域是网站应用程序或者服务开发——URL路由、Session、模板引擎、静态Web资源等等。

Spring MAC流程如下图所示:
从Spring生命周期出发..._其他_02

步骤一:Http 请求 到 DispatcherServlet
客户端请求提交到 DispatcherServlet。

步骤二:HandlerMapping 寻找处理器
由 DispatcherServlet 控制器查询一个或多个 HandlerMapping,找到处理请求的Controller。

步骤三:调用处理器 Controller
DispatcherServlet 将请求交给 Controller。

交互:步骤四+步骤五:调用业务处理和返回结果
Controller 调用service处理业务逻辑,返回 ModelAndView 给 DispatcherServlet。

步骤六+步骤七:处理视图映射并返回模型
DispatcherServlet 根据收到的modelAnddView,查询一个或多个 ViewResoler 视图解析器,找到 ModelAndView 指定的视图。

步骤八:视图View 负责将结果显示到客户端。

4.2.4 SpringBoot(可以略过了,四个特性拉高逼格)

springboot引入自动配置的概念,让项目配置变得更容易。
1、Spring Boot 本身并不提供Spring框架的核心特性以及扩展功能 ,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,SpringBoot并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具
2、Spring Boot 集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box),大部分的SpringBoot应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。
3、Spring Boot只是承载者,辅助开发者简化项目搭建过程的。如果承载的是WEB项目,使用Spring MVC作为MVC框架,那么工作流程和SpringMVC的是完全一样的,因为这部分工作是Spring MVC做的而不是Spring Boot
4、以前web应用要使用到tomat服务器启动,而springboot内置服务器容器,通过@SpringBootApplication中注解类中main函数启动即可。

4.2.5 三者区别(四者关系:外加一个springboot与springcloud的关系)

三个关系:
1、springboot与spring的关系:
springboot是spring的升级:springboot 基于约定优于配置,去掉了spring中的applicationContext.xml配置文件,简化了spring的配置流程;
2、spring与springmvc的关系:
没有太大关系,唯一的关系就是spring有七大模块,Core AOP DAO ORM Web Context WebMvc, 其中springmvc代表其中的mvc模块和web模块,非要说关系,springmvc是servlet的关系更加紧密,关系是
springmvc是servlet的升级:
springmvc是基于servlet的mvc框架,相对于单纯servlet 少了model中的映射
3、springboot与springmvc的关系:
没有关系,Spring Boot只是承载者,辅助开发者简化项目搭建过程的。如果承载的是WEB项目,使用Spring MVC作为MVC框架,那么工作流程和SpringMVC的是完全一样的,因为这部分工作是Spring MVC做的而不是Spring Boot ,唯一的关系,以前web应用要使用到tomat服务器启动,而springboot内置服务器容器,通过@SpringBootApplication中注解类中main函数启动即可。
范围大小:springmvc < spring < springboot
范围大小的解释:spring有七大模块,Core AOP DAO ORM Web Context WebMvc, 其中springmvc代表其中的mvc模块和web模块,springboot在spring上面包一层,让其消去配置,快速启动
范围大小得到三者关系:SpringBoot包裹着Spring,Springmvc只是Spring中的web和webmvc两个模块,所以SpringBoot = Spring + SpringMvc
所以,SpringBoot + Mybatis = SSM
附加:springboot 与 springcloud关系:
单体架构:springboot + mybatis
微服务架构:使用springcloud,其中每一个子项目是一个springboot
关系:springboot可以脱离springcloud单独使用,形成单体架构;但是,springcloud组件微服务架构的时候不能脱离springboot,每一个子项目必须是一个springboot项目。

4.3 Spring生命周期

1、开始初始化容器

2、加载BeanFactoryPostProcessor实现类
3、执行BeanFactoryPostProcessor的postProcessBeanFactory方法
4、加载BeanPostProcessor实现类

5、实例化业务bean
6、Aware接口族调用

7、执行BeanPostProcessor实现类的postProcessBeforeInitialization方法
8、执行InitializingBean实现类的afterPropertiesSet方法
9、执行bean的init-method属性指定的初始化方法
10、执行BeanPostProcessor实现类的postProcessAfterInitialization方法

11、初始化完成

12、关闭容器,执行DiposibleBean实现类的destory
13、执行bean的destroy-method属性指定的初始化方法

4.4 Spring 七个扩展点

1、Spring扩展点之BeanFactoryPostProcessor接口和BeanDifinitionRegistryPostProcessor接口
2、Spring扩展点之BeanPostProcessor接口

3、Spring扩展点之Aware接口族
4、Spring扩展点之SmartLifeCycle接口
5、Spring扩展点之FactoryBean接口

6、Spring事件监听机制

7、Spring @Import四种

五、小结

Spring生命周期和扩展点,完成了。

天天打码,天天进步!!!