首页 > 其他分享 >BeanFactoryAware原理机制

BeanFactoryAware原理机制

时间:2024-07-01 14:28:24浏览次数:19  
标签:BeanFactory Spring Bean 接口 bean BeanFactoryAware 原理 机制

BeanFactoryAware 是 Spring 框架中的一个接口,它允许一个 bean 在其初始化时感知到其所在的 BeanFactory。这通常用于在 bean 内部进行一些高级配置或访问 Spring 容器中的其他 bean。

简单使用

当你实现 BeanFactoryAware 接口时,你需要实现 setBeanFactory(BeanFactory beanFactory) 方法。Spring 容器会在 bean 的初始化过程中自动调用这个方法,并传入当前的 BeanFactory 实例。说人话就是,如果在写代码当中需要使用到当前的BeanFactory 来创建自己定义的Bean时,我们需要拿到BeanFactory对象的,我们可不可以直接在当前上下文中直接调用getBeanFactory()方法来获取呢?答案是并没有提供这么一个方法类主动获取,但是Spring提供了BeanFactoryAware 接口,让你被动获取,也就是回调给你BeanFactory对象。

/**
* 实现 BeanFactoryAware 接口,获取 Bean工厂对象。
*/
public static class XRedisRegister implements BeanFactoryAware  {
        private BeanFactory beanFactory; // 重新BeanFactoryAware的方法,让spring回调来注入
        
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            this.beanFactory = beanFactory;
        }
		
		public void myFunction(){
			// 可以使用 beanFactory 来做一些事情
		}
    }

实现机制

从spring源码中看aware接口在bean加载时的调用情况,BeanFactoryAware 接口很简单,只是继承了Aware来做第一重判断,在Spring通过反射获取各个Bean的时候会进行类型判断,如果是 BeanFactoryAware 的实现类则会进行BeanFactory注入。在Spring中的源码如下:

if (bean instanceof Aware) {
    if (bean instanceof BeanNameAware) {
      ((BeanNameAware) bean).setBeanName(beanName);
    }
    if (bean instanceof BeanClassLoaderAware) {
      ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
    }
    if (bean instanceof BeanFactoryAware) {
      ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
    }
  }
}

补充扩展

Spring的依赖注入的最大亮点就是你所有的Bean对Spring容器的存在是没有意识的。即你可以将你的容器替换成别的容器,例如Goggle Guice,这时Bean之间的耦合度很低。

但是在实际的项目中,我们不可避免的要用到Spring容器本身的功能资源,这时候Bean必须要意识到Spring容器的存在,才能调用Spring所提供的资源,这就是所谓的Spring Aware。其实Spring Aware本来就是Spring设计用来框架内部使用的,若使用了Spring Aware,你的Bean将会和Spring框架耦合。

Spring提供的Aware接口如下表所示:

接口作用
BeanNameAware获得到容器中Bean的名称
BeanFactoryAware获得当前bean factory,这样可以调用容器的服务
ApplicationContextAware获得当前application context,这样可以调用容器的服务
MessageSourceAware获得message source这样可以获得文本信息
ApplicationEventPublisherAware应用事件发布器,可以发布事件
ResourceLoaderAware获得资源加载器,可以获得外部资源文件

Spring Aware的目的是为了让Bean获得Spring容器的服务。因为ApplicationContext接口集成了MessageSource接口,ApplicationEventPublisherAware接口和ResourceLoaderAware接口,所以Bean继承ApplicationContextAware可以获得Spring容器的所有服务,但原则上我们还是用到什么接口就实现什么接口。

参考:
https://www.cnblogs.com/duanxz/p/3724429.html
https://yiyan.baidu.com/

标签:BeanFactory,Spring,Bean,接口,bean,BeanFactoryAware,原理,机制
From: https://blog.csdn.net/cj151525/article/details/140099389

相关文章

  • 浅谈 K8s Service 网络机制
    浅谈K8sService网络机制云原生运维圈 2024-07-0112:03 上海 1人听过 以下文章来源于腾讯云原生 ,作者王成腾讯云原生.云原生技术交流阵地,汇聚云原生最新技术资讯、文章、活动,以及云原生产品及用户最佳实践内容。王成,腾讯云研发工程师,Kubernetesmember,从......
  • 降维 (Dimensionality Reduction) 原理与代码实例讲解
    降维(DimensionalityReduction)原理与代码实例讲解作者:禅与计算机程序设计艺术/ZenandtheArtofComputerProgramming关键词:降维技术,数据可视化,特征选择,PCA,t-SNE,SVD,机器学习1.背景介绍1.1问题的由来在数据分析和机器学习领域,面对高维度的数据集是一个普遍且......
  • 量子机器学习原理与代码实战案例讲解
    量子机器学习原理与代码实战案例讲解作者:禅与计算机程序设计艺术/ZenandtheArtofComputerProgramming关键词:量子机器学习,QML,量子计算,量子算法,机器学习,Python编程,TensorFlowQuantum库1.背景介绍1.1问题的由来随着数据量的爆炸增长以及对更高效决......
  • 研发团队的激励机制与员工福利
    研发团队的激励机制与员工福利作者:禅与计算机程序设计艺术/ZenandtheArtofComputerProgramming关键词:研发团队管理,激励理论,绩效考核,员工福利体系设计1.背景介绍1.1问题的由来在现代企业尤其是科技公司中,研发团队是核心竞争力的源泉。然而,随着行业竞争日益激......
  • 最大熵模型原理与代码实战案例讲解
    最大熵模型原理与代码实战案例讲解作者:禅与计算机程序设计艺术/ZenandtheArtofComputerProgramming关键词:最大熵模型(MaximumEntropyModel),信息理论,概率建模,NLP,机器学习1.背景介绍1.1问题的由来在自然语言处理(NaturalLanguageProcessing,NLP)以及......
  • PageRank原理与代码实例讲解
    PageRank原理与代码实例讲解作者:禅与计算机程序设计艺术/ZenandtheArtofComputerProgramming关键词:PageRank算法、搜索引擎排名、链接分析、随机游走理论、网页重要性衡量1.背景介绍1.1问题的由来在互联网的早期,搜索引擎面临了一个关键挑战:如何为用户提供相......
  • Optimization Algorithms 原理与代码实战案例讲解
    OptimizationAlgorithms原理与代码实战案例讲解1.背景介绍1.1问题的由来优化算法是计算机科学、工程和数学中的一个核心领域,主要用于寻找满足特定约束条件下的最佳解决方案。在现实世界中,无论是最小化成本、最大化收益、提高效率还是解决问题的不确定性,优化算法都能......
  • Oozie原理与代码实例讲解
    Oozie原理与代码实例讲解1.背景介绍1.1问题的由来随着大数据和云计算的快速发展,企业级应用程序需要处理的作业量激增,同时,对于作业调度、监控和故障恢复的需求也日益迫切。传统的方法往往依赖于脚本编程或者手动配置,这种方式难以适应大规模、跨平台以及高可用性的需求。......
  • 数据预处理与特征工程原理与代码实战案例讲解
    数据预处理与特征工程原理与代码实战案例讲解1.背景介绍1.1问题的由来在数据科学和机器学习领域,数据是基础,而有效的数据预处理与特征工程则是提升模型性能的关键。数据通常来源于多种渠道,包括传感器、社交媒体、在线平台等,这些数据可能包含噪声、缺失值、异常值以及不......
  • 推荐系统(Recommender Systems) 原理与代码实例讲解
    推荐系统(RecommenderSystems)-原理与代码实例讲解1.背景介绍1.1问题的由来在海量信息时代,用户面对的信息量爆炸性增长,如何在庞大的数据中找到符合个人兴趣和需求的内容成了一个挑战。推荐系统正是为了解决这个问题而诞生的。通过分析用户的偏好、行为以及历史记录,......