本篇内容主要讲解“Spring Aware的原理和作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Aware的原理和作用是什么”吧!
为什么要说 Spring Bean 生命周期又说 Aware 呢?下来点亮剩下内容你也许就明白了:
在 Spring Bean Ready for Use
之前的起源当然是要调用构造器,所以 Constructor 毋庸置疑是创建 Spring Bean 的第一步
通过 Setter 方法完成依赖注入,SDI (Setter Dependency Injection)
依赖注入一旦结束,BeanNameAware.setBeanName()
会被调用,它设置该 bean 在 Bean Factory 中的名称
接下来调用 BeanClassLoaderAware.setBeanClassLoader()
,为 bean 实例提供类加载器,我们知道所有类都是要通过类加载器加载到上下文的,关于类的加载机制/双亲委派模型(大厂都爱问的面试题)内容会在后续给出来,让你透彻的了解
然后 BeanFactoryAware.setBeanFactory()
会被调用为 bean 实例提供其所拥有的 factory
关于 1、2 两点我要额外多说一些内容,请看下面代码:
这里,我们尝试通过构造器访问自动注入的 field Environment env
,当构造器被调用时,Spring Bean 还没被完全初始化,这就会导致 NullPointerExceptions
; 我们变换一下方式:
这种方式,Environment 实例被安全注入之后才调用 @PostConstruct
标记的方法,这样就不会抛出 NullPointerException
了。
这会回看周期图,有没有豁然开朗?
敲黑板
等所有 Spring Bean 都完成依赖注入(周期图中的 Setter Methods 部分)再使用 bean 的引用才是安全的方式,
后续会有一个章节专门说一说面试经常被问起的 Spring 有几种依赖注入方式
的尴尬问题,请关注后续文章
到这里终于可以说一说 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 容器的服务。
自定义 bean 实现 BeanNameAware
注册 bean
运行
和预想一样,Bean Name 输出结果为 myCustomBeanName
,如果移除掉 @Bean 注解的 name 属性, 输出结果为 getMyBeanName
在大多数情况下,我们应该避免使用任何 Aware 接口,除非我们需要它们。实现这些接口会将代码耦合到Spring框架,但是希望看过本节内容之后阅读框架源码思维更加清晰
到此,相信大家对“Spring Aware的原理和作用是什么”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。