在前面的示例程序中,程序总是通过Bean id 主动来获取Bean实例,程序总是先获得Bean id,然后采取获得Bean对象。
但对于一个真正的应用而言,一个Bean与Bean之间的关系是通过依赖注入管理的,常常不会通过调用容器的getBean 方法来获取Bean实例。可能的情况是:应用中已经获得了Bean实例的引用,但程序无法知道配置该Bean时指定的id属性,而程序又需要获取配置该Bean时指定的id属性。此时可借助于Spring提供的BeanNameAware接口,通过该接口允许Bean类获取部署该Bean时指定的id 属性。
BeanNameAware接口提供一个方法:setBeanName(String name),该方法的name参数就是Bean的id,实现该方法的Bean类就可通过该方法来获得部署该Bean的id了(该方法与前面介绍的BeanFactoryAware、ApplicationContextAware接口中的setter方法一样,这个setter方法不是由程序员来调用的,该方法由Spring容器负责调用)。
package UnderstandingBeanInContainer;
import org.springframework.beans.factory.BeanNameAware;
public class Chinese implements BeanNameAware {
//保存部署该Bean时指定的id属性
private String beanName;
@Override
public void setBeanName(String name) { //该方法的name参数就是Bean的id
// TODO Auto-generated method stub
this.beanName = name;
}
public void info(){
System.out.println("UBIC~Chinese实现类"+",部署该Bean时指定的id为"+beanName);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd"
>
<bean id="chineseBI" class="UnderstandingBeanInContainer.Chinese"/>
</beans>
package UnderstandingBeanInContainer;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext ctx =
new ClassPathXmlApplicationContext("bean.xml");
Chinese chin = ctx.getBean("chineseBI",Chinese.class);
chin.info();
}
}
当Spring容器完成了Bean初始化动作(包括回调实现InitializingBean接口所实现的afterPropertiesSet()方法、回调Bean配置中init-method属性所指定的方法)之后,回调实现BeanNameAware接口里的setBeanName(string name)方法。