一、目的
在某些特殊情况下,Bean需要实现某个功能,比如该bean需要输出国际化消息,或者该bean需要向Spring发布事件,但该功能必须借助于Spring容器才能实现,此时就必须让该Bean先获取Spring容器,然后借助于Spring容器来实现该功能。
为了让Bean获取它所在的Spring容器,可以让该Bean实现BeanFactoryAware接口。类似接口如:BeanNameAware,ResourceLoaderAware,ApplicationContextAware接口
二、示例
package com.home.bean;
import java.util.Locale;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class Persons implements ApplicationContextAware{
//将BeanFactory容器以成员变量保存
private ApplicationContext ctx;
/*
* Spring容器会检测容器中所有bean,如果发现某个bean实现了ApplicationContextAware接口,Spring容器
* 会在创建该bean之后,自动调用该方法,调用该方法时,会将该容器本身作为参数传递给该方法
*/
public void setApplicationContext(ApplicationContext ctx)
throws BeansException {
// TODO Auto-generated method stub
this.ctx=ctx;
}
public void sayHello(String name){
System.out.println(ctx.getMessage("hello", new String[]{name},Locale.getDefault()));
}
}
配置文件如下:
<!-- 国际化配置开始 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 驱动spring调用messageSource bean的setBasenems()方法,该方法需要一个数组参数,使用list元素配置多个数组元素 -->
<property name="basenames">
<list>
<value>message</value>
</list>
<!-- 如果有多个资源文件,全部列在此处 -->
</property>
</bean>
<bean id="persons" class="com.home.bean.Persons"></bean>
国际化配置信息如下:
hello=\u6B22\u8FCE\u4F60\uFF0C{0}
now=\u73B0\u5728\u65F6\u95F4\u662F,{0}
测试代码:
package spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.home.bean.Persons;
/**
*执行Persons对象的方法sayHello()方法时,该方法就自动具有了国际化的功能,
*而这种国际化功能实际上是由spring容器提供的,
*这就是让Bean获取他的容器的好处
*/
public class BeanGetApplication{
public static void main(String[] args) throws Exception{
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
Persons p=ctx.getBean("persons", Persons.class);
p.sayHello("中文让");
}
}