在前几篇的博客中,都是程序先创建Spring容器,再调用Spring容器的getBean()方法来获取Spring容器中的Bean。在这种访问模式下,程序中总是持有Spring容器的引用。那么,为了让Bean获取它所在的Spring容器,可以让该Bean实现BeanFactoryAware接口,BeanFactoryAware接口里只有setBeanFactory(BeanFactory beanFactory)方法。
1) 创建Person.java,并且继承ApplicationContextAware的接口。
public class Person implements ApplicationContextAware
{
// 将BeanFactory容器以成员变量保存
private ApplicationContext ctx;
/* Spring容器会检测容器中所有Bean,如果发现某个Bean实现了ApplicationContextAware接口,
Spring容器会在创建该Bean之后,自动调用该方法,调用该方法时,
会将容器本身作为参数传给该方法。*/
public void setApplicationContext(ApplicationContext ctx)
throws BeansException
{
this.ctx = ctx;
}
public void sayHi(String name)
{
System.out.println(ctx.getMessage("hello" , new String[]{name}
, Locale.getDefault(Locale.Category.FORMAT)));
}
}
2) bean.xml中的配置。
<?xml version="1.0" encoding="GBK"?>
<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.0.xsd">
<!-- 加载容器国际化所需要的语言资源文件 -->
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>message</value>
</list>
</property>
</bean>
<!-- Spring容器会检测容器中所有Bean,如果发现某个Bean实现了
ApplicationContextAware接口,Spring容器会在创建该Bean之后,
自动调用该Bean的setApplicationContext()方法,调用该方法时,
会将容器本身作为参数传给该方法。-->
<bean id="person" class="com.owen.app.service.Person"/>
</beans>
3) 国际化文件配置。(与前面介绍一样)
4) 实现的类。
public class SpringTest
{
public static void main(String[] args)throws Exception
{
ApplicationContext ctx = new
ClassPathXmlApplicationContext("beans.xml");
Person p = ctx.getBean("person" , Person.class);
p.sayHi("我的博客");
}
}