Spring源码学习IOC(7):浅析aware相关接口

Spring IoC源码学习:总览 前言 Spring 作为现在最优秀的框架之一,被广泛的应用于 Java 项目中,但是大多数人都只知道如何使用,而不知其中的原理。对大多数人来说可能知道如何使用已经足够了,但是对于想提升自己的人来说,学习 Spring 的源码是一个不错的选择。在过去的几个月里,我利用空闲时间将 IoC 的相关源码学习了一下,按照老习惯准备整理成笔记,以博文的形式记录下来,供自己以后使用,也供其他网友参考。由于涉及... 阅读详情

spring中 有一大堆Aware结尾接口,  例如BeanFactoryAware,  ApplicationContextAware, ServletContextAware等

 在程序中 我们自定义的bean实现了 Aware相关接口  spring 通过回调   就可以获得一些资源  

 比如说 我们的bean实现BeanFactoryAware  spring会在bean实例化(getBean)阶段 回调该setBeanFactory方法   注入BeanFactory实例(也就是this)   

 spring   BeanFactoryAware 接口定义

[java]  view plain copy print ?
  1. public interface BeanFactoryAware {  
  2.   
  3.    void setBeanFactory(BeanFactory beanFactory) throws BeansException;  
  4.   
  5. }  

 spring容器中的bean 实例化 是在AbstractBeanFactory getBean中发生

[java]  view plain copy print ?
  1. public Object getBean(String name, Class requiredType, Object[] args) throws BeansException {  
  2.     return doGetBean(name, requiredType, args, false);  
  3. }  

调用的 doGetBean 方法比较复杂  简单看看 创建单例这段

[java]  view plain copy print ?
  1. protected Object doGetBean(  
  2.             final String name, final Class requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException {  
  3.   
  4.         final String beanName = transformedBeanName(name);  
  5.             .................略          // Create bean instance.  
  6.             //bean的定义是不是单例   
  7.             if (mbd.isSingleton()) {  
  8.                 sharedInstance = getSingleton(beanName, new ObjectFactory() {  
  9.                     public Object getObject() throws BeansException {  
  10.                         try {  
  11.                             // 是一个抽象方法  在子类AbstractAutowireCapableBeanFactory中实现  
  12.                             return createBean(beanName, mbd, args);  
  13.                         }  
  14.                         catch (BeansException ex) {  
  15.                             destroySingleton(beanName);  
  16.                             throw ex;  
  17.                         }  
  18.                     }  
  19.                 });  
  20.                 bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);  
  21.             }  
  22.   
  23.         .................略  
  24.         return bean;  
  25.     }  

AbstractAutowireCapableBeanFactory  createBean方法

[java]  view plain copy print ?
  1. protected Object createBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)  
  2.         throws BeanCreationException {  
  3.   
  4.     AccessControlContext acc = AccessController.getContext();  
  5.     return AccessController.doPrivileged(new PrivilegedAction() {  
  6.         public Object run() {  
  7.             .................略  
  8.             //关注doCreateBean方法  
  9.             Object beanInstance = doCreateBean(beanName, mbd, args);  
  10.             if (logger.isDebugEnabled()) {  
  11.                 logger.debug("Finished creating instance of bean '" + beanName + "'");  
  12.             }  
  13.             return beanInstance;  
  14.         }  
  15.     }, acc);  
  16. }  

doCreateBean方法

[java]  view plain copy print ?
  1. protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) {  
  2.         // Instantiate the bean.  
  3.         BeanWrapper instanceWrapper = null;  
  4.         if (mbd.isSingleton()) {  
  5.             instanceWrapper = (BeanWrapper) this.factoryBeanInstanceCache.remove(beanName);  
  6.         }  
  7.         .................略  
  8.         // Initialize the bean instance.  
  9.         Object exposedObject = bean;  
  10.         try {  
  11.             populateBean(beanName, mbd, instanceWrapper);  
  12.             //实现 *Aware部分接口, InitializingBean接口  方法调用在此发生  
  13.             exposedObject = initializeBean(beanName, exposedObject, mbd);  
  14.         }  
  15.         catch (Throwable ex) {  
  16.             if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {  
  17.                 throw (BeanCreationException) ex;  
  18.             }  
  19.             else {  
  20.                 throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);  
  21.             }  
  22.         }  
  23.   
  24.         .................略  
  25.         return exposedObject;  
  26. }  

initializeBean方法

[java]  view plain copy print ?
  1. protected Object initializeBean(String beanName, Object bean, RootBeanDefinition mbd) {  
  2.     if (bean instanceof BeanNameAware) {  
  3.         ((BeanNameAware) bean).setBeanName(beanName);  
  4.     }  
  5.     if (bean instanceof BeanClassLoaderAware) {  
  6.         ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());  
  7.     }  
  8.     // 如果当前bean 是BeanFactoryAware的一个实例   
  9.     if (bean instanceof BeanFactoryAware) {  
  10.         //回调当前实例注入资源  
  11.         ((BeanFactoryAware) bean).setBeanFactory(this);  
  12.     }  
  13.   
  14.     Object wrappedBean = bean;  
  15.     if (mbd == null || !mbd.isSynthetic()) {  
  16.         //BeanPostProcessor 接口  postProcessBeforeInitialization方法回调  
  17.         wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);  
  18.     }  
  19.     try {  
  20.         // 实现InitializingBean接口  afterPropertiesSet方法调用  
  21.         invokeInitMethods(beanName, wrappedBean, mbd);  
  22.     }  
  23.     catch (Throwable ex) {  
  24.         throw new BeanCreationException(  
  25.                 (mbd != null ? mbd.getResourceDescription() : null),  
  26.                 beanName, "Invocation of init method failed", ex);  
  27.     }  
  28.   
  29.     if (mbd == null || !mbd.isSynthetic()) {  
  30.         wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);  
  31.     }  
  32.     return wrappedBean;  
  33. }  


Spring  aware相关接口

打怪上分! 手写Spring ioc 框架,狠狠的“撸撸”Spring 源码 估计很多朋友使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过。 你是不是有这样的感觉呢? 但是 spring 源码存在一个问题,那就是过于抽象,导致学习起来成本上升。所以本文由浅入深,只实现 spring 的核心功能,便于自己和他人学习 spring 的核心原理。 文章有点长,耐心阅读!如果对你有帮助,记得三连哦! spring 的核心 Spring 的核心就是 spring-beans,后面的一切 spring-boot,spring-cloud 阅读详情

相关推荐

ENSP:小型企业网络拓扑设计

包含的技术:ospf、dhcp中继、ac+ap、vrrp+mstp、acl、浮动路由、静态路由、vlan划分

weixin_45921302的博客 1万+

Spring IoC源码学习:invokeBeanFactoryPostProcessors 详解

前言 随着Spring IoC:context:component-scan节点解析的结束,obtainFreshBeanFactory方法的解析也告一段落,我们通过5篇文章,完整的介绍了obtainFreshBeanFactory方法。本文将介绍obtainFreshBeanFactory方法之后的另一个重要方法——invokeBeanFactoryPostProcessors。 ...

程序员囧辉 2万+

LightGBM处理类别特征和缺失值有多省心?一个真实业务数据案例带你上手

本文通过真实电商数据案例,详细解析了LightGBM如何高效处理类别特征和缺失值。相比传统方法,LightGBM仅需一行代码即可自动处理高基数类别特征和缺失值,大幅提升模型训练效率和预测准确度,特别适合业务场景中的脏数据处理。

weixin_30689307的博客 460

Spring IoC源码学习:obtainFreshBeanFactory 详解

前言 上文Spring IoC:ApplicationContext 刷新前的配置介绍了refresh 方法前的环境准备操作,接下来正式进入 refresh方法。prepareRefresh是refresh里的第一个方法,主要是一些准备工作,比较简单的方法,看一下就了解了。接下来是obtainFreshBeanFactory方法,该方法用于获得一个新的 BeanFactory,本...

程序员囧辉 1万+

点云语义分割:PointNet训练S3DIS数据集

文章目录一、数据准备1.1、数据下载二、训练三、测试 项目地址:pointnet 此次我们是用pointnet网络来做语义分割。代码在pointnet项目中的sem_seg文件夹下,里面也有README.md介绍了训练的过程。 一、数据准备 1.1、数据下载 原始数据下载 处理好的h5格式数据下载 二、训练 三、测试 ...

zhaoguanhua的博客 4176

华为OD机考双机位C卷 - 敌情监控 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 敌情监控 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 964

Spring IoC源码学习:finishBeanFactoryInitialization 详解

前言 在介绍了 obtainFreshBeanFactory、invokeBeanFactoryPostProcessors、registerBeanPostProcessors三个重要方法后,我们终于来到了最后一个重要方法:finishBeanFactoryInitialization。finishBeanFactoryInitialization 是这四个方法中最复杂也是最重要的,是整个...

程序员囧辉 9814

生成对抗网络(GAN)在数据增强中的应用【附核心实战代码】

生成对抗网络(GAN)由Ian Goodfellow等人在2014年提出。它包含两个主要的部分:生成器(Generator)和判别器(Discriminator)。生成器负责生成假数据,而判别器则用于区分输入的数据是真实的还是由生成器生成的。通过这种对抗过程,生成器不断优化自己,生成越来越真实的样本。最终,生成器生成的样本几乎无法被判别器区分与真实数据。

一键难忘的博客 3119

Spring深度学习:IOC容器及源码解析

大家经常戏称Java工程师为Spring工程师,毫无疑问,这句话体现出Spring框架在Java开发中的重要性和普及度。本文小豪将带大家深度学习Spring IOC底层源码,学习过程中不仅仅是了解Spring IOC的工作原理,更重要的是学会理解框架的底层逻辑,从而提升我们的思维能力。

Code豪客 1674

LLC 谐振转换器中为什么需要 ( L_m )(励磁电感)

在每个模态中,励磁电感 ( L_m )、谐振电感 ( L_r ) 和谐振电容 ( C_r ) 分别承担着储存和释放能量、维持谐振电流和电压波形的任务。Q1和Q2的交替导通确保了这些元件能够在不同的模态下实现能量的有效传输和谐振状态的维持。励磁电感 ( L_m ) 在这一过程中起着不可或缺的作用,确保了电路的高效运行和稳定性。

weixin_43199439的博客 3652

移位寄存器——用Verilog实现串入串出、串并和并串转换并进行Modelsim仿真

用Verilog实现串并转换 首先我们先要了并串和串并转换的原理 并串转换:先将八位数据暂存于一个八位寄存器器中,然后左移输出到一位输出端口,这里可以通过一个“移位”来实现,相当于实现了移位寄存器的功能。 串并转换:新输入的位值成为原来数据的最低位,将原来数据的最高位舍去,这里可以通过一个简单的“连接符”来实现。 我们这里采用两种方式来进行串并转换 一:lsb优先 Least Significant Bit,最低比特,最低位优先 二:msb优先 Most Significant Bit,最高比特,

H19981118的博客 2万+

Spring IoC源码学习:getBean 详解

前言 接着Spring IoC:finishBeanFactoryInitialization详解,我们正式开始学习获取bean实例方法,该方法是Spring最核心的方法。 正文 单击 preInstantiateSingletons方法里的getBean(beanName)代码,进入该方法。 getBean @Override public Object ...

程序员囧辉 1万+

高通GAIA V3命令参考手册的研读学习(15):自定制命令的详细工作描述

里的示例一样,手机APP发出这个GetManuFacturer的命令发0x0000,那么耳机回复:0x8000, 同时在回复的playload部分,用最多15个字节的ACSII码来表达制造商信息(因此最多15个字母)。那么这个APP在通过GAIA协议控制这个耳机时,不仅可以通过前面讲过的vendor ID来识别,也可以更进一步通过这个命令来识别这个耳机,到底是不是本公司的。通过这个可变长度的playload,真的是可以传达极多的事先约定的信息,相当的灵活,真是不错!这个命令用来得到设备的制造商信息。

qq_37191547的博客 397

Spring IoC源码学习:parseDefaultElement 详解

前言 接着Spring IoC:obtainFreshBeanFactory详解继续往下解析,本文来到 parseDefaultElement 方法。该方法是解析默认命名空间节点的方法,是加载 bean 定义模块的最核心方法。 正文 首先让我们回到Spring IoC:obtainFreshBeanFactory详解文末的 parseBeanDefinitions方法。 ...

程序员囧辉 6195

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring IoC源码学习:@Autowire 详解

前言 在Spring IoC:createBean 详解(上)中代码块4.5和Spring IoC:createBean详解(下)中代码块1、代码块4的 7.1.1我们遗留了一个解析——@Autowire注解的解析。之所以单独提出来,是因为在我现在接触的项目中,使用 @Autowire注解的比例非常高,可以说基本用过Spring的同学都接触过这个注解,重要性不言而喻。因此,单独拿...

程序员囧辉 8865

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Spring IoC源码学习:createBean 详解(上)

前言 接着Spring IoC:getBean详解,我们继续解析获取bean实例里的核心内容:创建bean实例。 正文 首先,我们进入createBean方法。 createBean @Override protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] a...

程序员囧辉 9985

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Spring IOC :相关接口分析、手写简易 Spring IOC

Spring IOC :相关接口分析、手写简易 Spring IOC

Henrik-Yao的博客 1248

Spring IoC源码学习:registerBeanPostProcessors 详解

前言 在Spring IoC:invokeBeanFactoryPostProcessors解析中我们介绍了invokeBeanFactoryPostProcessors方法,而本文将介绍另一个类似的方法——registerBeanPostProcessors。 invokeBeanFactoryPostProcessors方法主要用于处理BeanFactoryPostProces...

程序员囧辉 1万+

Spring IoC源码学习:总览,java面试问项目的难点是什么

由于逻辑比较复杂,因此在执行一个操作时可能会有一个很长的调用链,最终进行实际操作的方法,一般会以 do 为方法的前缀。既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。如果某些代码看了很多遍还是无法很好的理解,可以到网上搜下别人的文章参考,如果没有合适的参考,可以先放着,先往后看,也许等你把后面的流程看了,你在回过头来看就理解了。

2401_84412736的博客 1798

基础篇:IoC(十一):Aware接口

本文介绍了Spring框架中的Aware接口机制及其实现原理。Aware接口(如BeanFactoryAware和ApplicationContextAware)允许Bean感知其所在的容器环境。通过源码分析,展示了BeanFactoryAware通过initializeBean方法直接设置,而ApplicationContextAware则通过BeanPostProcessor机制实现。文章还探讨了Aware接口的典型应用场景,如SpringUtil工具类通过实现BeanFactoryPostProces

moneywenxue的博客 881

Spring IoC源码学习:createBean 详解(下)

前言 接着Spring IoC:createBean详解(上),我们继续解析创建bean实例的剩下内容。 正文 首先,我们回到Spring IoC:createBean详解(上)中的代码块3,doCreateBean 方法。 doCreateBean protected Object doCreateBean(final String beanName, final...

程序员囧辉 7160

spring-core 源码学习-IoC 之深入分析 Aware 接口(二十五)

spring-core IoC 之深入分析 Aware 接口1. Aware 接口2. Aware 子类2.1 示例3. 小结 AbstractAutowireCapableBeanFactory 的 #doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) 方法,主要干三件事情: 实例化 bean 对象:#createBeanInstance(String beanName, RootB

sunchuanwen1111的博客 247

Spring ioc源码分析

Spring源码分析 查看方式 先猜测,后验证,不需要一开始就调试代码 入口 从web.xml入口 DispatcherServlet extends HttpServlet init() :初始化方法(入口) service():浏览器输入url的时候,从web容器调用,doget,doPost执行逻辑 destory():生命周期最后关头 核心容器类图 BeanFactory ​ 是典型的...

黄金时代的架构之路 4580

spring初始化源码浅析之关键类和扩展接口

目录 1、关键接口和类 1.1、关键类之 DefaultListableBeanFactory 1.2、关键类之XmlBeanDefinitionReader 1.3、关键类之ClassPathXmlApplicationContext 2、spring初始化过程中对外暴露的扩展接口 3、扩展点的启动顺序 spring的IOC容器初始化流程很复杂,本文只关注流程中的关键点,勾勒出主要...

雷X峰 4516

Spring源码分析-IOC之Aware

Aware:已感知的,意识到的,所以这些接口从字面意思应该是能感知到所有Aware前面的含义,Spring中提供了一些Aware相关接口,比如BeanNameAware,BeanFactoryAware,ApplicationContextAware等,下面我们来看下BeanNameAware,BeanNameAware就是将name注入实例,我们来看下具体的应用: package com.c...

成凯的专栏 484

带你从零开始手写 spring ioc 框架,深入学习 spring 源码

IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理。 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过。 但是 spring 源码存在一个问题,那就是过于抽象,导致学习起来成本上升。 所以本项目由渐入深,只实现 spring 的核心功能,便于自己和他人学习 spring 的核心原理。 spring 的核心 Spring 的核心就是 spring-beans,后面的一切 spring-boot,spring-cl

weixin_48655626的博客 3256
上一篇: Spring源码学习IOC(6):IoC容器的高级特性
下一篇: Spring基于 Annotation 的简单介绍
java_wliang
博客等级 码龄15年 19粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值