在之前的例子中,程序总是通过Bean id获得Bean对象。
但是在实际中,一个Bean与Bean之间的关系是通过依赖注入管理的,常常不会通过调用容器的getBean方法来获取Bean实例。可能的情况是:应用中已经获得了Bean实例的引用,但程序无法知道配置该Bean时指定的id属性,而程序又需要配置该Bean时指定的id属性。
在某些极端情况下,程序开发Bean类时需要获得在容器中部署该Bean时指定的id属性,此时可借助于Spring提供的 BeanNameAware 接口,通过该接口允许Bean类获取部署该Bean时指定的id属性。
BeanNameAware接口提供的一个方法:setBeanName(String name),该方法的name参数就是Bean的id,实现该方法的Bean类就可通过该方法来获得部署该Bean的id了。
Chinese.java :
public class Chinese implements BeanNameAware{
private String beanName;
@Override
public void setBeanName(String name) {
this.beanName=name;
}
public void getBeanId(){
System.out.println("Chinese实现类,部署该Bean时指定的id为:"+beanName);
}
}
bean.xml 核心配置:
<bean id="chinese" class="com.bean.Chinese"/>
Test.java :
public class Test {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("bean.xml");
Chinese c=(Chinese) ctx.getBean("chinese");
c.getBeanId();
}
}
运行Test.java,控制台输出:
Spring容器何时回调Bean实例的setBeanName(String name)方法呢?Spring容器会在Bean初始化完成后回调该方法------这里的初始化指的是Bean的初始化行为:包括回调实现InitializingBean接口所实现的afterPropertiesSet方法,回调Bean配置中init-method属性指定的方法。当Spring容器完成了Bean的初始化动作之后,接下来将会回调实现BeanNameAware接口里的setBeanName(String
name)方法。