国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > WEB開發 > 正文

獲取Spring中bean對象或在Spring初始化完成之后使用Spring中bean對象

2024-04-27 15:15:30
字體:
來源:轉載
供稿:網友

        之前一直沒有做過服務端東西,現在有個需要,在服務端啟動后,后臺一直輪詢查詢一個信息,若發現信息則提醒用戶,給用戶發送一個通知。

        因為以前對服務端的涉及也就是在客戶端去調用服務端的Action,這樣服務端是被動的去執行某個方法,現在要在服務端主動去執行,剛開始有一些懵,不斷在網上查找資料,嘗試,將自己的一些方法和遇到的坑記錄下來。

        首先我用的方法的是,新建一個類,繼承自HttpServt類,然后重寫他的init()方法,在servlet類執行時,會首先去執行這個init()方法,我們只要將執行的邏輯在init()方法中調用即可:

public class MyServlet extends HttpServlet {    /**     *      */    PRivate static final long serialVersionUID = 1L;    @Override    public void init() throws ServletException {        // TODO Auto-generated method stub        super.init();        System.out.println("Servlet服務已啟動,開始輪詢>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");    }}

        要將Servlet設置為隨服務啟動而啟動,還需要在web.xml中去配置:

<servlet>  <servlet-name>AlarmPollingServlet</servlet-name>  <servlet-class>action.AlarmPollingServlet</servlet-class>  <load-on-startup>1</load-on-startup></servlet>

        在applicationContext.xml中去配置bean:
<bean id="myServlet" class="action.MyServlet" scope="prototype">  <property name="queryInterface" ref="queryInterfaceImpl"></property></bean>        但是這樣會隨之出現一個問題,因為我是在這個servlet中調用了dao層的接口中的方法,這個接口對象是在Spring容器中初始化的,由于在Servlet啟動的時候,Spring容器并不一定已經初始化完畢了,所以,在調用接口方法時,接口對象會報空指針異常。

        經過查閱資料我了解到有幾種解決方法:        1、在applicationContext.xml中注入bean時,在里面加上

init-method=" value "

        這個值,其中value值為將要執行的方法,但是我在項目運行時,這種方法無效,因對服務端內容不熟悉,所以還沒有查出具體原因,若大家有了解詳細的可以留言或者私信我交流。

        2、另一種方法是在Servlet中去獲取在Spring中注入的bean對象:

private static WebApplicationContext context;public Object findBean(String beanName) {  if (context == null) {    context = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());  }  return context.getBean(beanName);}

        這樣就可以在Servlet中去獲取到在Spring中注入的bean對象,通過bean對象就可以獲取里面的接口對象等,已經獲取到了bean對象,剩下的需要做什么就由自己決定了。

MyServlet servlet = (MyServlet) findBean("alarmPollingServlet");queryInterface = servlet.queryInterface;queryInterface.doQuery();

        

        經過這樣,就可以在servlet中去執行dao層接口中的方法了,但是,我這里還有一個問題(哈哈,真是問題好多),因為我的項目中在Spring中注入的bean對象里面,還有引用到其他bean對象,這樣會在dao層接口的實現類中繼續報出空指針異常,目前還未解決,所以沒有用這種方法。

        以下是我用的方法:        自定義類繼承自ApplicationListener<ContextRefreshedEvent>,重寫onApplicationEvent(ContextRefreshedEvent arg0)方法:

public class InstantiationTracingBeanPostProcessor implements        ApplicationListener<ContextRefreshedEvent> {  private queryInterface queryInterface;  @Override  public void onApplicationEvent(ContextRefreshedEvent arg0) {    // TODO Auto-generated method stub    if (arg0.getApplicationContext().getParent() == null) {      // 需要執行的邏輯代碼,當spring容器初始化完成后就會執行該方法。      queryInterface.doQuery();    }  }}        繼承這個類,當服務端啟動之后,Spring容器初始化完成之后,就會回調他的onApplicationEvent(ContextRefreshedEvent arg0)這個方法,所以,我們將需要執行的邏輯代碼寫在這個方法里就可以了,在執行這個方法的時候,Spring容器已經初始化完畢,這樣在用到Spring中注入的對象時就不會再有空指針異常。

        以上內容為我自己磕磕絆絆中查詢到的,記錄下來,也希望能夠幫助有同樣困惑的人,如果以上內容中有不合理或者錯誤的,或者各位大神有什么更好的解決方法,望大家留意或者私信交流,謝謝!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东乡族自治县| 白河县| 班戈县| 肇庆市| 商都县| 武强县| 沅陵县| 垣曲县| 蒙自县| 广宁县| 余庆县| 太仓市| 巧家县| 衡山县| 岳阳市| 东港市| 科技| 贵溪市| 湘阴县| 馆陶县| 布尔津县| 五原县| 永丰县| 伊宁县| 彭山县| 裕民县| 达尔| 岫岩| 屏东市| 芜湖市| 武夷山市| 义马市| 佛坪县| 通州市| 宁夏| 从江县| 门源| 襄城县| 雷山县| 黄陵县| 营口市|