非spring託管對象如何擷取到spring託管對象,spring託管
一些thread類或servlet不能通過spring註解的方式調用spring容器裡面的類
嘗試將thread或servlet加上@component或@controller註解變成被spring容器管理,再調用spring容器裡面的其他類,失敗!
最終找出下面兩種解決方案:
一,通過spring設定檔applicationContext.xml初始化
[java] view plaincopy
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class SpringUtil{
private static ApplicationContext applicationContext = null;
public static ApplicationContext getApplicationContext() {
if(applicationContext == null){
applicationContext = new FileSystemXmlApplicationContext("applicationContext.xml");
}
return applicationContext;
}
}
缺點:
這裡面的applicationContext.xml是全檔案路徑,這也是這種方式不是很靈活的原因之一,
調用SpringUtil會建立一次ApplicationContext對象.如果將static去掉改為非靜態,那麼每次調用該方法時都會new一個該對象,效率應該會更差.
二,通過實現ApplicationContextAware介面
在spring初始化時,會通過該介面實現的setApplicationComtext方法將ApplicationContext對象注入到該類中,具體見下面
我的解決方式選擇該種:
1、定義SpringUtil
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public void setApplicationContext(ApplicationContext applicationContext)throws BeansException {
SpringUtil.applicationContext = applicationContext;
}
}
2、spring的設定檔加入
<bean id="applicationContext" class="com.lefu.pushCore.other.SpringUtil"/>
3、通過如下方法便能擷取到所有由spring管理的對象了:
PushController pushController = (PushController) SpringUtil.getApplicationContext().getBean("pushController");
參考文章:http://blog.csdn.net/a19881029/article/details/7842070