spring getbean 方法分析
阿新 • • 發佈:2019-01-06
在最近的專案中,有個地方我們不得不實用getBean的方法,自己從Spring context中獲取bean進行資料庫操作。
方法一(效率低,極易出現bug,不推薦使用):
剛剛開始的時候,我們使用這中方式,但是在應用過程中發現此方式效率低下,而且極易出現bug。 在我們系統中會生成ehcacheauto_created時間戳資料夾,
<!-- lang: java -->
String[] xmlCfg = new String[] {"classpath:/spring/applicationContext-service.xml",
"classpath:/spring/applicationContext-util.xml",
"classpath:/spring/applicationContext.xml"} ;
ApplicationContext context = new FileSystemXmlApplicationContext(xmlCfg);
// 獲取inspectionUtil bean
inspectionUtil = (InspectionUtil) context.getBean("inspectionUtil");
所以我google了一下,改用其他方法。
方法二(效率高,靈活性高,可複用,推薦使用): 建立一個工具類SpringContextsUtil ,通過實現Spring中的ApplicationContextAware介面,在applicationContext.xml中注入bean後Spring會自動呼叫setApplicationContext方法。此時我們就可以獲取到Spring context。
<!-- lang: java -->
public classSpringContextsUtilimplementsApplicationContextAware{
private static ApplicationContext applicationContext; //Spring應用上下文環境
/**
* 實現ApplicationContextAware介面的回撥方法,設定上下文環境
* @param applicationContext
* @throws BeansException
*/
publicvoidsetApplicationContext (ApplicationContext applicationContext)throws BeansException {
SpringContextsUtil.applicationContext = applicationContext;
}
/**
* @return ApplicationContext
*/
publicstatic ApplicationContext getApplicationContext(){
return applicationContext;
}
/**
* 獲取物件
* @param name
* @return Object 一個以所給名字註冊的bean的例項
* @throws BeansException
*/
publicstatic Object getBean(String name)throws BeansException {
return applicationContext.getBean(name);
}
/**
* 獲取型別為requiredType的物件
* 如果bean不能被型別轉換,相應的異常將會被丟擲(BeanNotOfRequiredTypeException)
* @param name bean註冊名
* @param requiredType 返回物件型別
* @return Object 返回requiredType型別物件
* @throws BeansException
*/
publicstatic Object getBean(String name, Class requiredType)throws BeansException {
return applicationContext.getBean(name, requiredType);
}
/**
* 如果BeanFactory包含一個與所給名稱匹配的bean定義,則返回true
* @param name
* @return boolean
*/
publicstaticbooleancontainsBean(String name){
return applicationContext.containsBean(name);
}
/**
* 判斷以給定名字註冊的bean定義是一個singleton還是一個prototype。
* 如果與給定名字相應的bean定義沒有被找到,將會丟擲一個異常(NoSuchBeanDefinitionException)
* @param name
* @return boolean
* @throws NoSuchBeanDefinitionException
*/
publicstaticbooleanisSingleton(String name)throws NoSuchBeanDefinitionException {
return applicationContext.isSingleton(name);
}
/**
* @param name
* @return Class 註冊物件的型別
* @throws NoSuchBeanDefinitionException
*/
publicstatic 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);
}
}
呼叫方法:
<!-- lang: java -->
// 獲取inspectionUtil bean
inspectionUtil = (InspectionUtil) SpringContextUtil.getBean("inspectionUtil");
注:
1、使用時會出現無法獲取applicationContext,並丟擲NullPointerException。 原因:使用此方法必須在spring applicationContext.xml中注入bean。否則spring無法自動呼叫setApplicationContext。如下
<!-- lang: xml -->
<beanid="springContextsUtil"class="com.sinosoft.sepmis.util.SpringContextsUtil" ></bean>
2、如果注入後仍然出現這個問題。 則修改<beans default-autowire="byName" default-lazy-init="true">中的default-lazy-init="false"。 或者是修改bean注入屬性
<!-- lang: xml -->
<beanid="springContextsUtil"class="com.sinosoft.sepmis.util.SpringContextsUtil"lazy-init="false"></bean>