经过ApplicationContextAware获取spirng容器里面的bean

1、实现

一、ApplicatinContextHelper

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

 
public class ApplicationContextHelper implements ApplicationContextAware {
  
	private static ApplicationContext applicationContext;     //Spring应用上下文环境
 
  /**
  * 实现ApplicationContextAware接口的回调方法,设置上下文环境  
  * @param applicationContext
  * @throws BeansException
  */
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    ApplicationContextHelper.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 <T> T getBean(String name, Class<T> 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);
  }
}

二、spring 配置

<bean id="applicationContext" class="com.iflashbuy.base.common.ApplicationContextHelper"/>

 

2、原理

ApplicatinContextHelper继承了spring的ApplicationContextAware接口,并实现了setApplicatinContext方法spring容器在启动过程当中会去查找到继承了applicationContextAware的全部接口,并将applicationContext经过调用setApplicationContext方法传递给ApplicationContextHelper。相关spring实现为  Spring源码中ApplicationContextAwareProcessor.postProcessBeforeInitialization()方法。java

有图有真相web

 

3、注意事项

在一个java web项目中ApplicatationContextHelper这个bean能够配置在spring上下文中,也能够配置在springmvc上下文中,当配置在springmvc上下文中时候,ApplicationHelper只可以获取到springmvc上下恩相关的bean,spring上下文同理。spring

相关文章
相关标签/搜索