首页 > 编程语言 >Spring源码(四) Aware 接口

Spring源码(四) Aware 接口

时间:2024-07-27 09:39:35浏览次数:14  
标签:instanceof applicationContext Spring 接口 Aware bean 源码

Aware 接口:

Aware 接口是 Spring 提供的一组标记接口, 表示bean可以通过回调方法从Spring容器接收特定框架对象的通知。

public interface Aware {

}

Spring提供了大量以 Aware 命名的接口,如BeanNameAware、BeanFactoryAware、ApplicationContextAware等。

这些接口定义了回调方法,通过这些回调方法,Spring容器可以将容器中的一些资源、状态、环境信息注入到Bean中。

Aware示例:

可以参阅 org.springframework.context.support.ApplicationContextAwareProcessor 和org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory

这些代码中用于处理Aware接口回调的示例。

  • ApplicationContextAwareProcessor 的 Aware 使用示例:

代码:org.springframework.context.support.ApplicationContextAwareProcessor#invokeAwareInterfaces

首先会判断对象是否属于 Aware接口类型,接着根据不同的Aware接口实现类,调用不同的实现类的逻辑。

    private void invokeAwareInterfaces(Object bean) {
        //首先会判断对象是否属于 Aware接口类型
        if (bean instanceof Aware) {
            //根据不同的Aware接口实现类,调用不同的实现类的逻辑。
            if (bean instanceof EnvironmentAware) {
                //设置环境
                ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
            }
            if (bean instanceof EmbeddedValueResolverAware) {
                ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
            }
            if (bean instanceof ResourceLoaderAware) {
                ((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
            }
            if (bean instanceof ApplicationEventPublisherAware) {
                //设置EventPublisher
                ((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
            }
            if (bean instanceof MessageSourceAware) {
                ((MessageSourceAware) bean).setMessageSource(this.applicationContext);
            }
            if (bean instanceof ApplicationContextAware) {
                ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
            }
        }
    }
  • AbstractAutowireCapableBeanFactory 的 Aware 示例:

代码: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeAwareMethods

也是同样的判断对象是否属于 对应的Aware接口类型。

    private void invokeAwareMethods(final String beanName, final 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);
            }
        }
    }

标签:instanceof,applicationContext,Spring,接口,Aware,bean,源码
From: https://www.cnblogs.com/expiator/p/18326643

相关文章

  • 273java jsp SSM校园二手商品交易网站系统(源码+文档+运行视频+讲解视频)
    项目技术:SSM+Maven+Vue等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/10......
  • SpringBoot Thymeleaf 模板标签
    扩展Thymeleaf模板标签上一篇我们写到SpringBoot依赖之Thymeleaf模版引擎的使用,当时只列举了简单文本标签,下面针对多标签进行分析和分享。Thymeleaf的模板标签,包括文本显示、属性设置、条件判断、循环迭代、表单处理、片段引用、国际化支持等常用功能。我们尽可能......
  • java集合之Map篇——HashMap(底层源码非常详细说明)
    前言前面先做了红黑树的讲解平衡二叉树和红黑树-CSDN博客,就是为了为了Map集合做铺垫,Map的几个实现集合底层都用到了红黑树。由于HashMap的东西有点多,HashTable和TreeMap下篇再说明。一、HashMaphashMap底层是哈希表+哈希桶(数组或红黑树) Set篇的几张图会漂亮一点1.......
  • Spring学习(一)Bean生命周期
    Spring最重要的功能就是管理bean,所以bean的生命周期特别重要Spring配置文件分两种,一种是xml配置,一种是注解(Java代码)的配置第一步:Spring扫描(通过加载两种配置文件扫描)并且加载类定义(BeanDefinition),这个时候会生成一个BeanDefinitionMap,并且判断扫描出来的类型中有没有实现Bean......
  • 数据结构(Java):HashMap源码解析【JDK17】
    1、整体总结 2、成员属性table哈希数组DEFAULT_INITIAL_CAPACITY哈希表默认容量值(16)MAXIMUM_CAPACITY最大容量值DEFAULT_LOAD_FACTOR默认负载因子threshold当前存放元素数量达到该值时就会触发数组扩容TREEIFY_THRESHOLD树化条件之一(转化为红黑树的阈值)MIN_......
  • Linux内核链表源码的简单操作
    一、Linux内核链表源码的获取下载系统源码的方法常见的有两种:第一种访问网站下载:kernel.org第二种输入Linux命令下载:sudoaptinstalllinux-source-5.15.0(一般这种下载的是当前系统所用到的系统源码版本)下载完之后在/usr/src中可找到系统源码的压缩包,可以解压......
  • SpringBoot源码初学者(二):SpringBoot事件监听器
    ps:真正适合阅读源码的新手来看的SpringBoot源码讲解,如果你真的想读懂SpringBoot源码,可以按照以下推荐的方式来阅读文章打开ide,打开SpringBoot源码,跟着文章一起写注释,写自己的注释不要过于纠结没讲到的地方,毕竟SpringBoot源码那么多,想全讲完是不可能的,只要跟着文章认真阅......
  • 体积计算器(三种语言)源码、效果图
    声明⚠️:英文、藏语翻译均来源网络,若不准确,请于本人联系,请勿抄袭!源码#A-1V=0#体积r=0#小半径R=0#大半径a=0#棱长&长b=0#宽h=0#高DMJ=0#底面积PI=3.14#π(保留两位小数)four_three=1/4*3#四分之三three_one=1/3*1#三分之一R......
  • 零基础STM32单片机编程入门(二十二) ESP8266 WIFI模块实战含源码
    文章目录一.概要二.ESP8266WIFI模块主要性能参数三.ESP8266WIFI模块芯片内部框图四.ESP8266WIFI模块原理图五.ESP8266WIFI模块与单片机通讯方法1.硬件连接2.ESP8266模块AT指令介绍六.STM32单片机与ESP8266WIFI模块通讯实验1.硬件准备2.软件工程3.软件主要代码4.实验......
  • Spring的Bean生命周期中@PostConstruct注解
    前言在Spring框架中,@PostConstruct注解用于在Bean初始化完成后立即执行某些方法。这个注解的作用是保证在依赖注入完成后,执行一些初始化工作。诞生背景@PostConstruct注解的诞生是为了提供一种标准化的、简单的方法来进行对象初始化工作。1.简化初始化逻辑在传统的Java开发......