通过org.springframework.context.ApplicationContextAware来优雅获取spring容器中的bean

有时候我们为web项目中的一些工具类需要获取bean的调用,但是该类一般又不能通过容器注入的方式自动装配bean。这时候很多人会通过ClassPathXmlApplicationContext等方式读取spring的配置文件来重新初始化一遍spring中的bean,显然这不是理想的方式,毕竟web容器中已经初始化过一次bean对象了。下边我们用ApplicationContextAware接口获取ApplicationContext 对象。

实现ApplicationContextAware接口的类,在 bean容器初始化时,spring容器会把上下文信息自动注入到applicationContext中。

实例:

import org.springframework.beans.BeansException; 
import org.springframework.beans.factory.NoSuchBeanDefinitionException; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.ApplicationContextAware; 
 
/** 
 *功能描述:获取spring容器,以访问容器中定义的其他bean  
 */ 
  /**   
 @Component
public class SpringContextUtil implements ApplicationContextAware {


  /**  
  * 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候中取出ApplicaitonContext.  
  *    
  *   
  */ 
        private static ApplicationContext applicationContext; //Spring应用上下文环境    
 
        /**   
         * 实现ApplicationContextAware接口的回调方法,设置上下文环境      
         * @param applicationContext   
         * @throws BeansException   
         */ 
        public void setApplicationContext(ApplicationContext applicationContext) 
                        throws BeansException { 
                SpringContextUtil.applicationContext = applicationContext; 
        } 
 
        /**   
         * @return ApplicationContext   
         */ 
        public static ApplicationContext getApplicationContext() { 
                return applicationContext; 
        } 
 
        /**   
         * 获取对象      
         * @param name   
         * @return Object 一个以所给名字注册的bean的实例   
         * @throws BeansException   
         */ 
        public static Object getBean(String name) throws BeansException { 
                return applicationContext.getBean(name); 
        } 
 
        /**   
         * 获取类型为requiredType的对象   
         * 如果bean不能被类型转换,相应的异常将会被抛出(BeanNotOfRequiredTypeException)   
         * @param name       bean注册名   
         * @param requiredType 返回对象类型   
         * @return Object 返回requiredType类型对象   
         * @throws BeansException   
         */ 
        public static Object getBean(String name, Class requiredType) 
                        throws BeansException { 
                return applicationContext.getBean(name, requiredType); 
        } 
 
        /**   
         * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true    
         * @param name   
         * @return boolean   
         */ 
        public static boolean containsBean(String name) { 
                return applicationContext.containsBean(name); 
        } 
 
        /**   
         * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。   
         * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)      
         * @param name   
         * @return boolean   
         * @throws NoSuchBeanDefinitionException   
         */ 
        public static boolean isSingleton(String name) 
                        throws NoSuchBeanDefinitionException { 
                return applicationContext.isSingleton(name); 
        } 
 
        /**   
         * @param name   
         * @return Class 注册对象的类型   
         * @throws NoSuchBeanDefinitionException   
         */ 
        public static Class getType(String name) 
                        throws NoSuchBeanDefinitionException { 
                return applicationContext.getType(name); 
        } 
 
        /**   
         * 如果给定的bean名字在bean定义中有别名,则返回这些别名      
         * @param name   
         * @return   
         * @throws NoSuchBeanDefinitionException   
         */ 
        public static String[] getAliases(String name) 
                        throws NoSuchBeanDefinitionException { 
                return applicationContext.getAliases(name); 
        } 
}

-------------------
调用:

UserService userService = (UserService) SpringContextUtil.getBean("userService");

转载于:https://my.oschina.net/zhaolin/blog/1591569

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值