0

是否可以將spring bean注入由調度程序作業控制的輪詢過濾器類(FClass)中? 我不太明白單身人士在這裏如何應用。將彈簧豆注入非單例類

我明白spring bean是singleton,所以爲了將Spring bean注入到類FClass中。我需要將FClass定義爲一個bean並添加DI作爲屬性等。

那麼如何知道FClass是否應該是單例?我假設只有單身人士的課程可以創建,並且可以爲他們完成DI。

我的問題是:

我需要能夠注入我的門面豆xfacade到FCLASS。 x_facacde處理dao對象。它將Y_dao和一個Z_hibernate會話bean作爲DI注入。

當我試圖創建一個StatusPollingFilter(FClass)的spring bean並注入了facade bean時 - 我得到了一個null,並且setter從來沒有被調用在調試模式下注入。

問題: 我認爲這可能與StatusPollingFilter的線程/調度程序性質有關,並且由於spring bean是單例,因此可能無法正常工作。

我正在考慮爲StatusPollingFilter(FClass)創建一個工廠。但需要知道這是否是正確的事情,並且在我做了太多工作之前我正在正確的軌道上,並且意識到即使這不起作用,因爲問題可能在其他地方。理想情況下,我只想以最簡單的方式更新表格。但我必須使用休眠作爲DAO存在,但休眠配置使用

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
with /hibernate/TopoObject.hbm.xml 

文件。

因此,無論我如何嘗試這個,我總是會在會話或注入的外觀bean上得到空指針異常。 在這裏讀取QA的一些看起來像是因爲StatusPollingFilter是使用調度程序實例化的,而不是彈出它不能意識到DI bean。所以上面的工廠模式在這裏有幫助。

我可能有一個額外的問題,但我會穿過那座橋,當我來到它。但只是簡單地提一下,如果有人知道我可能碰到的問題......不知道調度程序如何調用實例的工廠,因爲它全部由第三方api控制 - 它調用StatusPollingFilter,但我'假設我是否通過了工廠作爲班級和參數,它會發現它的路徑......但最初的部分是主要問題。請忽略後者華夫餅。提前致謝。

+0

我想我理解單身人士問題更好閱讀更多的職位。但如果我錯了,請糾正我。也就是說,在任何給定的時間,如果有多於一個類的實例,那麼它不能是單例,在我的情況下,輪詢器會爲正在嘗試輪詢的每個對象運行預定線程。這個班級會有很多例子存在。所以我不能創建一個bean - 對嗎?但是我後來得不到的是,我的DAO對象將是一個bean,但也會有很多這樣的實例...那麼怎麼才能像spring bean一樣存在呢?對不起...還是輸了? – user2144209 2013-03-13 19:26:21

回答

0

其實:

我只能認爲是單身可以創建

就是你不對的地方課程。 一個bean只是一個你讓Spring實例化的類。 默認,它們是作爲單例創建的,但是你可以使用屬性scope(相當出人意料地)在bean上指定範圍。您可以指定的值是那些文檔here

中指定所以,你必須要小心的一件事是豆注入作用域爲prototyperequest成單身。

+0

好的。感謝那些指針它def增加了我對春天範圍的知識等。我設法解決我的問題與上面。 – user2144209 2013-03-14 15:55:21

+0

我現在有臭名昭着的問題「org.hibernate.HibernateException:沒有Hibernate Session綁定到線程,並且配置不允許創建非事務性的一個。」我的概率將需要一些幫助,所以我會問,作爲一個單獨的Q. - 我認爲它必須處理外觀bean和DAO bean的上下文等。 – user2144209 2013-03-14 15:58:43

+0

在特定的線程中發佈您的新問題。檢查常見問題知道爲什麼:http://stackoverflow.com/faq – benzonico 2013-03-14 16:11:09

0

閱讀更多 - 我遇到過ans。 因爲StatusPollingFilter對象在調度程序的控制下(我知道調度程序與它有關),所以它不知道spring bean,這就是爲什麼當我嘗試注入bean時,我一直得到空值的原因。

我創建了一個類:

ApplicationContextProvider implements ApplicationContextAware 

添加靜態訪問

private static ApplicationContext appContext; 

沒有爲它制定者:

public void setApplicationContext(ApplicationContext context) 
{ 
    appContext = context; 
} 

,並添加

public static Object getBean(String beanName) throws BeansException 
{ 
    return appContext.getBean(beanName); 
} 

在代碼中使用:

EvoTAMDAOFacade evoDao = (EvoTAMDAOFacade) ApplicationContextProvider.getBean("evoDaoFacade"); 

,我現在獲得了外觀bean和所有注入豆成門面。 我仍然有一個問題與休眠會話,但多數民衆贊成由於其他問題。

pt這裏是我沒有訪問的bean,因爲它不在控制彈簧容器,所以我需要以某種方式得到它,可能可以通過工廠方法做到這一點,但爲什麼在有更簡單的時候就搞亂了辦法。 感謝任何可能發佈或試圖理解我的問題的人的幫助。