分享Spring面试三剑客,SpringBean的生命周期,SpringMVC的执行流程,SpringBoot的自动装配原理(总结版)

1.SpringBean的生命周期

1.首先我们通过Bean标签或者@Bean注解先配置一个bean 

#实例化,实例化前后,实例化感知的Bean后置处理器 
2.创建一个Spring的容器,在创建Spring容器的内部,首先将我们配置的Bean读取为 BeanDefinition,会解析我们的配置类,扫描对应的注解,例如Component。然后循环我们的 BeanDeifinition,一个一个的调用BeanFactory.getBean方法去创建bean。在生产之前会进行判 断,是否已经创建了Bean,如果存在直接返回,否则去调用doCreateBean()方法进行实例化。 
3.在实例化前首先调用InstantiationAwareBeanPostProcessor首先调用它的 postProcessBeforeInstantiation方法 实例化前处理: 可以在实例化之前执行一些特定的逻辑,例如记录日志、修改 Bean 的配置,条件判 断是否实力化特定的bean啊等等。 
4.然后调用doCreateBean()进行实例化 
5.实例化之后调用InstantiationAwareBeanPostProcessor的 postProcessAfterInstantiation方法,当然返回结果为true时,说明应该为bean设置属性。如 果返回结果为false,跳过bean属性赋值环节。默认实现返回true。 

#属性注入 
6.属性注入,通过populateBean()方法依赖注入(主要通过三级缓存不问这个别说) 
7.调用InstantiationAwareBeanPostProcessor的postProcessProperties方法 允许我们在对属性注入后对 Bean 的属性值进行自定义的调整或修改 

#初始化 初始化之前首先会调用invokeAwareMethods方法,里面就会调用继承Aware接口相关接口的一些方法 
8.BeanNameAware中的setBeanName(String name)方法,将(beanName)传递给 Bean 9.BeanClassLoaderAware中的setBeanClassLoader方法,将ClassLoader 对象传递给 Bean 10.BeanFactoryAware中的setBeanFactory,将BeanFactory 对象传递给 Bean 11.ApplicationContextAware中的setApplicationContext()方法,将 ApplicationContext设置给Bean 
#BeanPostProcessor,Bean后置处理器
12.接着会调用我们的BeanPostProcessor的postProcessBeforeInitialization()方法 
13.接着调用使用@PostConstruct修饰的方法 
14.调用InitializingBean的afterPropertiesSet()方法 13.初始化,就是调用我们的initMethod()方法 15.在初始化之后还会调用我们的BeanPostProcessor的postProcessAfterInitialization() 方法,这个进行重写这个方法进行进行属性的赋值,假如说你对刚才依赖注入的属性值不满意,就可以在 这里进行一个修改,最后返回一个我们创建好的Bean放到我们的单例池中,就是 singletonObjectMap。 

#销毁 
16.先调用我们的@PreDestory注解修饰的方法 
17.接着自定义销毁方法,destroy-method

2.SpringMVC的执行流程

四大组件一定要提出来!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
前端控制器DisPacherServlet
处理器映射器HandlerMapping处理器适配器HandlerAdapter
视图解析器ViewResolver
1. 用户发送请求至前端控制器DispatcherServlet。
2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3. 处理器映射器根据请求url找到具体的处理器,生成处理器对象返回给DispatcherServlet。
4. DispatcherServlet拿着刚才的生成的处理器对象通过HandlerAdapter处理器适配器调用对应
处理器。
5. 执行处理器(Controller层,也叫后端控制器)。
6. Controller执行完成返回数据和视图(ModelAndView)返回给HandlerAdapter。
7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9. ViewReslover解析后返回具体的View视图(JSP / HTML)。
10. DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11. DispatcherServlet响应用户,用户看到界面和数据。

3.SpringBoot的自动装配原理

1.当我们启动我们的启动引导类的时候会加载一个叫SpringBootApplication的一个复合注解
2.加载它里面的一个叫做@EnableAutoConfiguration的注解来启动自动配置
3.点进去发现它会加载一个@Import的注解,会导入一个叫做
AutoConfigurationImportSelector(自动配置导入选择器)的类
4.进入这个类之后,发现它有个selectImports方法,它里面会调用一个叫做
getAutoConfigurationEntry()的方法方法
获取了spring-boot项目中需要自动配置的项(bean)
5.继续点进去发现它会调用一个叫做getCandidateConfigurations()获取候选配置的方法,它用于
获取所有候选的自动配置类
6.再点进去发现有个SpringFactoriesLoader.loadFactoryNames获取加载的工厂名保存到list
数组里面返回。
7.再点进去loadFactoryNames方法会发现调用了loadSpringFactories方法,在这个方法内部,
最终就会执行
classLoader.getResources("META-INF/spring.factories")获取位于类路径下的名为
META-INF/spring.factories 的资源文件
8.这个文件存在放在我们的依赖库的的spring-boot-autoconfigure-2.3.4.RELEASE.jar包中
9.这个文件中存放的一系列的自动配置类,例如我们的Redis的自动配置类
RedisAutoConfiguration
10.点进去这个类之后发现上面有个@ConditionalOnClass({RedisOperations.class}),这个
注解的是条件注解,他是根据我们的类路径中是否存在特定的类来判断当前配置类是否生效,一般它指定 的这个类都是没有的,我们需要引入相关的起步依赖,才能使配置类生效(激活)。
11.例如Redis我们需要引入spring-boot-starter-data-redis这个起步依赖才能使redis自动配
置类RedisAutoConfiguration生效
12. RedisAutoConfiguration这个配置类中帮我们构建了RedisTemplate和
StringRedisTemplate对象并使用@Bean注解交给我们的SpringIOC容器管理,这样我们就可以通过 DI的方式,例如@Autowired注解直接注入我们的RedisTemplate来进行redis的相关操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值