問題描述: 在activemq的監聽器中,通過註解@Autowired或@Resource註入bean時,獲取到的bean為null。調用該bean的方法時會報空指針異常。 問題原因: 當調用bean內方法時,spring容器中還沒有完成對註解bean的掃描,dispatcher.xml中配置的註解 ...
問題描述:
在activemq的監聽器中,通過註解@Autowired或@Resource註入bean時,獲取到的bean為null。調用該bean的方法時會報空指針異常。
問題原因:
當調用bean內方法時,spring容器中還沒有完成對註解bean的掃描,dispatcher.xml中配置的註解bean的優先順序沒有框架中的contextListener的優先順序高,所以contextListener初始化的時候根據@Autowired掃描,肯定是null的。
解決辦法:
在web.xml文件中增加一個監聽器類,該類實現ServletContextListener,ApplicationContextAware這兩個介面。
1 2 3 |
<listener>
<listener- class >com.activemq.common.InitComponent</listener- class >
</listener>
|
當容器啟動的時候,會執行該類中的contextInitialized(ServletContextEvent servletContextEvent)方法。
我們要做的,就是在該類中新增獲取bean的方法。
1 2 3 4 5 6 7 8 9 10 |
@SuppressWarnings ( "unchecked" )
public static <T> T getBean(String name) {
checkApplicationContext();
return (T) applicationContext.getBean(name);
}
private static void checkApplicationContext() {
if (applicationContext == null ) {
throw new IllegalStateException( "applicaitonContext未註入" );
}
}
|
此時,獲取bean的方式就變為:
1 2 |
ConsumerDao consumerDao = InitComponent.getBean( "ConsumerDao" );
consumerDao.saveMessage(param);
|
註意:
ConsumerDao介面上需要加上註解:@Repository("ConsumerDao")
參考文章:
http://blog.csdn.net/gaoshili001/article/details/77776863