Bean获取Spring容器

一、目的
在某些特殊情况下,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("中文让");
    }
}
发布了91 篇原创文章 · 获赞 7 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章