Spring中的Aware作用以及源码
文章目录
- 1.源码
- 2.Aware调用链
- 3.initializeBean 初始化Bean
在有些场景中我们需要感知到容器的存在,需要获取容器的工具类,这个时候需要使用Spring Aware提供的工具类
Spring 框架中提供许多实现Aware接口的类,这些类主要是为了辅助Spring访问容器中的数据
1.源码
自定义实现ApplicationContextAware接口类,然后在setApplicationContext方法打断点,debug模式下查看堆栈信息
2.Aware调用链
createBean - doCreateBean - initializeBean - applyBeanPostProcessorsBeforeInitialization - invokeAwareInterfaces
3.initializeBean 初始化Bean
protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {if (System.getSecurityManager() != null) {AccessController.doPrivileged((PrivilegedAction<Object>) () -> {invokeAwareMethods(beanName, bean);return null;}, getAccessControlContext());}else {invokeAwareMethods(beanName, bean);}Object wrappedBean = bean;if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}try {invokeInitMethods(beanName, wrappedBean, mbd);}catch (Throwable ex) {throw new BeanCreationException((mbd != null ? mbd.getResourceDescription() : null),beanName, "Invocation of init method failed", ex);}if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean;
}
invokeAwareMethods,applyBeanPostProcessorsBeforeInitialization
invokeAwareMethods 对ware执行分类
private void invokeAwareMethods(String beanName, Object bean) {if (bean instanceof Aware) {if (bean instanceof BeanNameAware) {((BeanNameAware) bean).setBeanName(beanName);}if (bean instanceof BeanClassLoaderAware) {ClassLoader bcl = getBeanClassLoader();if (bcl != null) {((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);}}if (bean instanceof BeanFactoryAware) {((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);}}
}
applyBeanPostProcessorsBeforeInitialization 获取所有的执行器,依次执行
@Override
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor processor : getBeanPostProcessors()) {Object current = processor.postProcessBeforeInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;
}
Spring中的Aware作用以及源码相关推荐
- spring中的Aware接口的作用以及代码剖析
前言 不知道大家有没有遇到这样的场景,比如,我自己有一个PersonService, 实现类是PersonServiceImpl,我想在PersonServiceImpl中使用application ...
- java中batch基础_详解Spring batch 入门学习教程(附源码)
详解Spring batch 入门学习教程(附源码) 发布时间:2020-09-08 00:28:40 来源:脚本之家 阅读:99 作者:achuo Spring batch 是一个开源的批处理框架. ...
- Spring Boot Dubbo 应用启停源码分析
作者:张乎兴 来源:Dubbo官方博客 背景介绍 Dubbo Spring Boot 工程致力于简化 Dubbo RPC 框架在Spring Boot应用场景的开发.同时也整合了 Spring Boo ...
- Spring Boot 2.x 启动全过程源码分析(上)入口类剖析
转载自 Spring Boot 2.x 启动全过程源码分析(上)入口类剖析 Spring Boot 的应用教程我们已经分享过很多了,今天来通过源码来分析下它的启动过程,探究下 Spring Boo ...
- 手撸Spring系列12:MyBatis(源码篇)
说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...
- spring MVC cors跨域实现源码解析
spring MVC cors跨域实现源码解析 名词解释:跨域资源共享(Cross-Origin Resource Sharing) 简单说就是只要协议.IP.http方法任意一个不同就是跨域. sp ...
- Spring Boot 2.x 启动全过程源码分析(全)
上篇<Spring Boot 2.x 启动全过程源码分析(一)入口类剖析>我们分析了 Spring Boot 入口类 SpringApplication 的源码,并知道了其构造原理,这篇我 ...
- 【java】本地客户端内嵌浏览器3 - Swing 使用 Spring 框架 + 打包项目 + 转exe + 源码
目录 ★☆★ 写在前面 ★☆★ ★☆★ 本系列文章 ★☆★ ★☆★ 开源网址 ★☆★ 一.给 Swing 加上 Spring 0.前期努力 I. SpringBoot II. SpringMVC 1. ...
- mysql src.rpm_从.src.rpm包中提取出完整的源码的方法
1 什么是完整的源码 就是说,最初始的源码加上打了所有的patch后的源码,即最新的源码. 2 过程 2.1 从.src.rpm中提取完整的rpm工程文件 2.1.1 rpm to cpio rpm2 ...
最新文章
- consul服务下线通知_Consul微服务的配置中心体验篇-阿里云开发者社区
- 移动端网站优化也不容小觑!
- 如何利用python整合excel_Python将多个excel文件合并为一个文件
- pythonsvm图像分类_python图像处理之sift-kmeans-SVM图像分类
- 优秀的领导与差劲的领导
- 趣说游戏AI开发:曼哈顿街角的A*算法 1
- Linux 命令 —— iostat I/O 和 CPU 监视工具
- zabbix api java_zabbix的Java API(一)
- 【LeetCode】【HOT】287. 寻找重复数(抽象环形链表)
- 笔记本电脑配置推荐_笔记本电脑配置推荐
- NNS域名系统之SGAS
- unity camera aspect
- 如何解决终端(cmd或Terminal)的下载速度很慢
- 绕过IceSword文件检测的Trojan.Win32.Mnless.zpc/ojj6erv.sys
- 小米手环5表盘bin文件解包修改
- java蓝宇快递打印系统_蓝宇快递打印系统
- 学习系统地思考——《第五项修炼》读后感
- 沃谈小知识| 断网不下岗的“断点续传”功能
- 人类像计算机一样思考 议论文,人工智能时代——人应像人一样思考作文800字...
- Vulkan 简介及其特点