spring 源码解析番外篇之Aware

前言

我们在学习 spring 源码时会经常看到Aware这个东西,这是啥东西呢?有啥作用呢?

比如:ApplicationContextAware、BeanFactoryAware等。

Aware

在Spring框架中,Aware是一组接口,它们被称为Aware接口,因为它们可以使Bean"感知"到Spring容器的某些特性。这些接口通常以Aware结尾,例如ApplicationContextAwareBeanFactoryAware等。

当一个类实现了某个Aware接口时,Spring在创建这个类的Bean实例时,会自动调用相应的set方法,将相关的对象注入到这个Bean中。这样,这个Bean就可以在其内部使用这些对象了。

例如,如果一个类实现了ApplicationContextAware接口,那么Spring会在创建这个类的Bean实例时,自动调用setApplicationContext方法,将ApplicationContext对象注入到这个Bean中。这样,这个Bean就可以在其内部使用ApplicationContext对象了。

java 复制代码
 import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 ​
 public class MyBean implements ApplicationContextAware {
     private ApplicationContext applicationContext;
 ​
     @Override
     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
         this.applicationContext = applicationContext;
     }
 ​
     public void doSomething() {
         // 在这里,我们可以使用applicationContext对象
         // 例如,获取其他的Bean
         OtherBean otherBean = applicationContext.getBean(OtherBean.class);
         otherBean.performTask();
     }
 }
 ​

这就是Aware接口的基本作用:它们可以使Bean"感知"到Spring容器的某些特性,从而在Bean内部使用这些特性。这句话什么意思?

这句话的意思是,通过实现Aware接口,Bean可以获取到Spring容器中的一些对象或者信息,然后在Bean的内部使用这些对象或者信息。

  • 如上面的例子,如果一个Bean实现了ApplicationContextAware接口,那么这个Bean就可以"感知"到Spring容器的ApplicationContext对象。
  • Spring在创建MyBean这个Bean的实例时,会自动调用setApplicationContext方法,将ApplicationContext对象注入到这个Bean中。这样,这个Bean就可以在其内部使用ApplicationContext对象了,例如,它可以通过ApplicationContext对象获取到其他的Bean。

这就是所谓的"感知":Bean通过实现Aware接口,可以获取到Spring容器中的一些对象或者信息,然后在其内部使用这些对象或者信息。这种机制使得Bean可以更加灵活地与Spring容器和其他Bean交互。

总结

然而,虽然Aware接口非常强大,但它们也有一些缺点。最主要的缺点是,使用Aware接口会使你的代码与Spring框架紧密耦合,这可能会影响代码的可测试性和可移植性。

Aware接口是Spring设计为框架内部使用的,因此,除非必要,否则不建议在你的代码中直接使用这些Aware接口。在大多数情况下,你可以使用Spring的依赖注入功能来获取和操作Bean,而无需直接使用Aware接口。这种方式更符合依赖注入的原则,可以使你的代码更加松耦合,更易于测试和移植。

相关推荐
计算机小白一个2 分钟前
蓝桥杯 Java B 组之岛屿数量、二叉树路径和(区分DFS与回溯)
java·数据结构·算法·蓝桥杯
White graces15 分钟前
正则表达式效验邮箱格式, 手机号格式, 密码长度
前端·spring boot·spring·正则表达式·java-ee·maven·intellij-idea
菠菠萝宝16 分钟前
【Java八股文】10-数据结构与算法面试篇
java·开发语言·面试·红黑树·跳表·排序·lru
不会Hello World的小苗23 分钟前
Java——链表(LinkedList)
java·开发语言·链表
Allen Bright1 小时前
【Java基础-46.3】Java泛型通配符详解:解锁类型安全的灵活编程
java·开发语言
柃歌1 小时前
【UCB CS 61B SP24】Lecture 7 - Lists 4: Arrays and Lists学习笔记
java·数据结构·笔记·学习·算法
柃歌1 小时前
【UCB CS 61B SP24】Lecture 4 - Lists 2: SLLists学习笔记
java·数据结构·笔记·学习·算法
是姜姜啊!1 小时前
redis的应用,缓存,分布式锁
java·redis·spring
梨落秋溪、2 小时前
输入框元素覆盖冲突
java·服务器·前端
hrrrrb2 小时前
【Java】Java 常用核心类篇 —— 时间-日期API(上)
java·开发语言