文章目录

  • 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作用以及源码相关推荐

  1. spring中的Aware接口的作用以及代码剖析

    前言 不知道大家有没有遇到这样的场景,比如,我自己有一个PersonService,  实现类是PersonServiceImpl,我想在PersonServiceImpl中使用application ...

  2. java中batch基础_详解Spring batch 入门学习教程(附源码)

    详解Spring batch 入门学习教程(附源码) 发布时间:2020-09-08 00:28:40 来源:脚本之家 阅读:99 作者:achuo Spring batch 是一个开源的批处理框架. ...

  3. Spring Boot Dubbo 应用启停源码分析

    作者:张乎兴 来源:Dubbo官方博客 背景介绍 Dubbo Spring Boot 工程致力于简化 Dubbo RPC 框架在Spring Boot应用场景的开发.同时也整合了 Spring Boo ...

  4. Spring Boot 2.x 启动全过程源码分析(上)入口类剖析

    转载自   Spring Boot 2.x 启动全过程源码分析(上)入口类剖析 Spring Boot 的应用教程我们已经分享过很多了,今天来通过源码来分析下它的启动过程,探究下 Spring Boo ...

  5. 手撸Spring系列12:MyBatis(源码篇)

    说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...

  6. spring MVC cors跨域实现源码解析

    spring MVC cors跨域实现源码解析 名词解释:跨域资源共享(Cross-Origin Resource Sharing) 简单说就是只要协议.IP.http方法任意一个不同就是跨域. sp ...

  7. Spring Boot 2.x 启动全过程源码分析(全)

    上篇<Spring Boot 2.x 启动全过程源码分析(一)入口类剖析>我们分析了 Spring Boot 入口类 SpringApplication 的源码,并知道了其构造原理,这篇我 ...

  8. 【java】本地客户端内嵌浏览器3 - Swing 使用 Spring 框架 + 打包项目 + 转exe + 源码

    目录 ★☆★ 写在前面 ★☆★ ★☆★ 本系列文章 ★☆★ ★☆★ 开源网址 ★☆★ 一.给 Swing 加上 Spring 0.前期努力 I. SpringBoot II. SpringMVC 1. ...

  9. mysql src.rpm_从.src.rpm包中提取出完整的源码的方法

    1 什么是完整的源码 就是说,最初始的源码加上打了所有的patch后的源码,即最新的源码. 2 过程 2.1 从.src.rpm中提取完整的rpm工程文件 2.1.1 rpm to cpio rpm2 ...

最新文章

  1. consul服务下线通知_Consul微服务的配置中心体验篇-阿里云开发者社区
  2. 移动端网站优化也不容小觑!
  3. 如何利用python整合excel_Python将多个excel文件合并为一个文件
  4. pythonsvm图像分类_python图像处理之sift-kmeans-SVM图像分类
  5. 优秀的领导与差劲的领导
  6. 趣说游戏AI开发:曼哈顿街角的A*算法 1
  7. Linux 命令 —— iostat I/O 和 CPU 监视工具
  8. zabbix api java_zabbix的Java API(一)
  9. 【LeetCode】【HOT】287. 寻找重复数(抽象环形链表)
  10. 笔记本电脑配置推荐_笔记本电脑配置推荐
  11. NNS域名系统之SGAS
  12. unity camera aspect
  13. 如何解决终端(cmd或Terminal)的下载速度很慢
  14. 绕过IceSword文件检测的Trojan.Win32.Mnless.zpc/ojj6erv.sys
  15. 小米手环5表盘bin文件解包修改
  16. java蓝宇快递打印系统_蓝宇快递打印系统
  17. 学习系统地思考——《第五项修炼》读后感
  18. 沃谈小知识| 断网不下岗的“断点续传”功能
  19. 人类像计算机一样思考 议论文,人工智能时代——人应像人一样思考作文800字...
  20. Vulkan 简介及其特点

热门文章

  1. 基础 | batchnorm原理及代码详解
  2. 工程中导入sqlite -sqlite 基础教程(1)
  3. 个人网站中的小贴纸(待更新)
  4. HTML页面空格不显示问题
  5. React-Native中Animate动画使用方法汇总整理(一)之简单动画的实现
  6. 【Nginx入门系列】第一章 手把手带你搭建Nginx服务器
  7. CSDN Markdown编辑器之emoji表情
  8. java图像处理---灰度化(二值化)处理
  9. 如何使用人工智能进行目标受众细分和个性化营销:提高客户转化率和忠诚度
  10. 森田疗法的治疗原则:忍其所痛,为所当为