通过如下前序两篇文章:

  1. Spring Bean 生命周期之“我从哪里来”?
  2. Spring Bean 生命周期之“我要到哪里去”?
    我们了解了 Spring Bean 的生命周期核心内容,bean 是如何被初始化变为 Ready for Use 的状态,当资源被回收时又是如何被 destroy 的,但 Spring Bean Life Cycle图并未被全部点亮,这篇文章将点亮剩余内容,同时说说你常见的 XxxxAware 接口

为什么要说 Spring Bean 生命周期又说 Aware 呢?下来点亮剩下内容你也许就明白了:

  1. 在 Spring Bean Ready for Use之前的起源当然是要调用构造器,所以 Constructor 毋庸置疑是创建 Spring Bean 的第一步
  2. 通过 Setter 方法完成依赖注入,SDI (Setter Dependency Injection)
  3. 依赖注入一旦结束,BeanNameAware.setBeanName() 会被调用,它设置该 bean 在 Bean Factory 中的名称
  4. 接下来调用 BeanClassLoaderAware.setBeanClassLoader(),为 bean 实例提供类加载器,我们知道所有类都是要通过类加载器加载到上下文的,关于类的加载机制/双亲委派模型(大厂都爱问的面试题)内容会在后续给出来,让你透彻的了解
  5. 然后 BeanFactoryAware.setBeanFactory() 会被调用为 bean 实例提供其所拥有的 factory

关于 1、2 两点我要额外多说一些内容,请看下面代码:

这里,我们尝试通过构造器访问自动注入的 field Environment env,当构造器被调用时,Spring Bean 还没被完全初始化,这就会导致 NullPointerExceptions
我们变换一下方式:

这种方式,Environment 实例被安全注入之后才调用 @PostConstruct标记的方法,这样就不会抛出 NullPointerException 了。

这会回看周期图,有没有豁然开朗?

敲黑板

等所有 Spring Bean 都完成依赖注入(周期图中的 Setter Methods 部分)再使用 bean 的引用才是安全的方式,

后续会有一个章节专门说一说面试经常被问起的 Spring 有几种依赖注入方式的尴尬问题,请关注后续文章

到这里终于可以说一说 Aware 了,且看

Aware

Aware 翻译过来可以理解为"察觉的;注意到的;感知的" ,XxxxAware 也就是对…感知的,没有 Aware 就是无感知的吗?对喽

Spring 的依赖注入最大亮点就是所有的 Bean 对 Spring 容器的存在是没有意识的,拿 Spring Bean 生命周期之“我从哪里来”? 文章中“小学生入少先队”为例子说明,小学生还是那个小学生,加入少先队还是加入共青团只不过规则不一样罢了
但是在实际项目中,我们不可避免的要用到 Spring 容器本身提供的资源(难免要有事情需要少先队组织的帮助),这时候要让 Bean 主动意识到 Spring 容器的存在,才能调用 Spring 所提供的资源,这就是 Spring Aware. 其实 Spring Aware 是 Spring 设计为框架内部使用的,若使用了,你的 Bean 将会和 Spring 框架耦合,所以自己不单独使用,但是在读框架源码时希望你不再模糊.

常见的 Spring Aware 接口

Aware子接口 描述
BeanNameAware 获取容器中 Bean 的名称
BeanFactoryAware 获取当前 BeanFactory ,这样可以调用容器的服务
ApplicationContextAware 同上,在BeanFactory 和 ApplicationContext 的区别 中已明确说明
MessageSourceAware 获取 Message Source 相关文本信息
ApplicationEventPublisherAware 发布事件
ResourceLoaderAware 获取资源加载器,这样获取外部资源文件

来看类关系图:

当然不止以上这些 Aware, 通常使用 Spring Aware 的目的是为了让 Bean 获得 Spring 容器的服务。

代码示例

BeanNameAware

自定义 bean 实现 BeanNameAware

注册 bean

运行

和预想一样,Bean Name 输出结果为 myCustomBeanName,如果移除掉 @Bean 注解的 name 属性, 输出结果为 getMyBeanName

总结

在大多数情况下,我们应该避免使用任何 Aware 接口,除非我们需要它们。实现这些接口会将代码耦合到Spring框架,但是希望看过本节内容之后阅读框架源码思维更加清晰

灵魂追问

  1. 框架中有哪些经典的 Aware 应用?
  2. 到现在你能很好的理解 Spring Bean 的生命周期吗?

Demo代码

涉及到 Spring Bean 生命周期的测试代码由于内容较多,没有写在此处,关注公众号并回复 「demo」获取相关代码,请自行尝试运行结果


提高效率工具


欢迎持续关注公众号:「日拱一兵」

  • 前沿 Java 技术干货分享
  • 高效工具汇总
  • 面试问题分析与解答
  • 技术资料领取

后续会出一系列文章点亮上图,同时进行 Spring 知识点解释与串联,在工作中充分利用 Spring 的特性
另外,还会推出 Java 多线程与 ElasticSearch 相关内容

持续关注,带你像读侦探小说一样轻松趣味学习 Java 技术栈相关知识

[外链图片转存失败(img-Lnxhc2n8-1563497233511)(http://rgyb.sunluomeng.top/公众账号文章/感想与总结/_image/2019-06-18/a (1)].png)

Spring Aware 到底是什么?相关推荐

  1. Spring Aware 到底是个啥?

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 通过如下前序两篇文章: Spring Bean 生命周期之"我从哪里来" ...

  2. Spring Aware接口

    Spring中有很多继承于aware中的接口,这些接口到底是做什么用到的. public interface Aware {} Aware是一个具有标识作用的超级接口,实现该接口的bean是具有被sp ...

  3. Spring Aware容器感知技术

    ​ Spring Aware是什么 Spring提供Aware接口能让Bean感知Spring容器的存在,即让Bean可以使用Spring容器所提供的资源. Spring Aware的分类 几种常用的 ...

  4. Spring MVC 到底是如何工作的

    转载自  Spring MVC 到底是如何工作的 这篇文章将深入探讨Spring框架的一部分--Spring Web MVC的强大功能及其内部工作原理. 这篇文章的源代码可以在GitHub上找到. 项 ...

  5. spring boot: spring Aware的目的是为了让Bean获得Spring容器的服务

    Spring Aware的目的是为了让Bean获得Spring容器的服务 //获取容器中的bean名称 import org.springframework.beans.factory.BeanNam ...

  6. Spring Aware 是什么?

    本文内容如有错误.不足之处,欢迎技术爱好者们一同探讨,在本文下面讨论区留言,感谢. 文章目录 简述 原理 标记 回调 例子 定义MyBeanName 注册Config Bean 启动应用程序 例子结论 ...

  7. spring aware的使用;spring aware 各种接口的作用解析

    spring aware的使用: 使用了spring Aware 你的bean将会和spring框架耦合, spring aware 的目的是为了让bean获取spring容器的服务: spring ...

  8. Spring Boot 到底是怎么做到自动配置的?

    作者:祖大帅 juejin.im/post/5b679fbc5188251aad213110 SpringBoot的故事从一个面试题开始 Spring Boot.Spring MVC 和 Spring ...

  9. 茅塞顿开:Spring Aware原理解析

    问题 为什么被Spring管理的类.只要实现了Aware接口.Spring就会自动把对应的对象注入进来.这个bean如果想要使用直接使用就可以了.如下: Spring会自动把ApplicationCo ...

最新文章

  1. jmeter压测_jmeter压测学习2linux运行jmeter环境
  2. spoj 26130 Binary numbers
  3. windows下的MySql实现读写分离
  4. Optional.isEmpty()在JDK 11 EA构建中可用
  5. 05-图像的平滑处理(不同的滤波操作)
  6. QT子线程与主线程的信号槽通信
  7. openSUSE 13.1 Milestone 2 发布
  8. ROC曲线(Receiver Operating Characteristic Curve)
  9. bat 调用class文件_拯救写框架的程序员!用字节码替代反射,实现任意函数调用...
  10. 软硬件融合新时代——让软件够灵活,硬件够高效,鱼和熊掌可兼得
  11. System Toolkit for Mac(Mac系统维护工具)
  12. java中queue的使用
  13. 国外知名的技术网站、社区
  14. android 市场 百度地图,百度地图 下载_地图导航软件_车载安卓应用_路畅市场
  15. error LNK1123: failure during conversion to COFF: file invalid or corrupt
  16. python文件查重_使用Python查找目录中的重复文件
  17. python执行外部方法_python执行外部程序的常用方法小结
  18. 如何点亮QQ邮箱图标 - 龙 炫家族特权
  19. 挺准的皮肤检测皱纹问答测试题
  20. 计算机中专实训方案,中职学校计算机专业实训模式初探

热门文章

  1. Android findViewById()找不到自定义View对象的一种原因
  2. java开发电脑软件_JAVA开发程序员,开发使用笔记本推荐?
  3. Unity Shader学习:素描效果
  4. 【JT-1/2电子式同步检查继电器】
  5. 【CSS基础】盒子模型、浮动布局、ps切图、定位及一些零碎知识点
  6. Android OpenCv4 图像透视变换之图片矫正
  7. 海为c7触屏与计算机通讯,海为Haiwell C7 以太网7寸触摸屏
  8. HMI流水灯运行(xctf)
  9. 基于AlexNet卷积神经网络的手写体数字识别系统研究-附Matlab代码
  10. 计算机网络(一)——网络基础