7.8.4 获得Bean本身的id
对于实际的Java
应用而言,Bean
与Bean
之间的关系是通过依赖注入管理的,通常不会通过调用容器的getBean()
方法来获取Bean
实例。可能的情况是,应用中已经获得了Bean
实例的引用,但程序无法知道配置该Bean
时指定的id
,可是程序又确实需要获取配置该Bean
时指定的id
属性。
此外,当程序员在开发一个Bean
类时,该Bean
何时被部署到Spring
容器中,部署到Spring
容器时所指定的id
是什么,开发该Bean
类的程序员无法提前预知.
在某些极端情况下,业务要求程序员在开发Bean
类时能预先知道该Bean
的配置id
,此时可借Spring
提供的BeanNameAware
接口,通过BeanNameAware
接口即可提前预知该Bean
的配置id
BeanNameAware
接口提供了一个方法:
方法 | 描述 | ||
---|---|---|---|
setName(String name) |
该方法的name 参数就是Bean 的id ,实现该方法的Bean 类就可通过该方法来获得部署该Bean 的id 。 |
||
BeanNameAware 接口中的setBeanName(String name) 方法与前面介绍的BeanFactoryAware 、 ApplicationContextAware 两个接口中的setter 方法一样,这个setter 方法不是由程序员来调用的,该方法由Spring 容器负责调用—当Spring 容器调用这个setter 方法时,会把部署该Bean 的id 属性作为参数传入。 |
|||
# 程序示例 # | |||
## 项目结构 ## | |||
|
Chinese.java
下面定义了一个Bean
,该Bean
实现了BeanNameAware
接口。
1 | package org.crazyit.app.service; |
上面的Chinese
类实现了BeanNameAware
接口,并实现了该接口提供的setBeanName()
方法。
beans.xml
1 |
|
Spring
容器会检测容器中的所有Bean
,如果发现某个Bean
实现了BeanNameAware
接口, Spring
容器就会在创建该Bean
之后,自动调用该Bean
的setBeanName()
方法,调用该方法时,会将该Bean
的配置id
作为参数传给该方法—该方法的实现部分将Spring
传入的参数(Bean
的配置id)赋给该Chinese
对象的beanName
实例变量,因此接下来即可通过该beanName
实例变量来访问Bean
的配置id
.
SpringTest.java
将该Bean
部署在容器中,该Bean
的部署与普通Bean
的部署没有任何区别。在主程序中通过如下代码测试
1 | package lee; |
执行结果
1 | Chinese实现类, 部署该Bean时指定的id为chinese |
从代码执行结果可以看到, Spring
容器初始化Chinese
这个Bean
时回调setBeanName()
方法,回调该方法时,该Bean
的配置id
将会作为参数传给beanName
实例变量,这样该Bean
的其他方法即可通过beanName
实例变量来访问该Bean
的配置id
。
小结
在Bean
类中需要获得Bean
的配置id的情形并不是特别常见的,但如果有这种需即可考虑让Bean
类实现BeanNameAware
接口。
原文链接: 7.8.4 获得Bean本身的id