7.8.4 获得Bean本身的id
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
属性作为参数传入。
程序示例
项目结构
1 | E:\workspace_QingLiangJiJavaEEQiYeYingYongShiZhang5\BeanNameAware |
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
接口。