解決spring懶加載以及@PostConstruct結(jié)合的坑_第1頁
解決spring懶加載以及@PostConstruct結(jié)合的坑_第2頁
解決spring懶加載以及@PostConstruct結(jié)合的坑_第3頁
解決spring懶加載以及@PostConstruct結(jié)合的坑_第4頁
解決spring懶加載以及@PostConstruct結(jié)合的坑_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第解決spring懶加載以及@PostConstruct結(jié)合的坑目錄spring懶加載及@PostConstruct的坑下面是一個初始化數(shù)據(jù)的組件遺留問題@PostConstruct注入不成功直接先說原因吧1.忽略ssm本身對注解是通過掃包才讓注解有效的2.忽略@Service的注解3.注意掃包區(qū)間4.@PostCoustruct注解用于

spring懶加載及@PostConstruct的坑

舉例說明:

下面是一個初始化數(shù)據(jù)的組件

@Component

publicclassInitData{

*初始化加載bean

@PostConstruct

publicvoidinit(){

MapString,Stringmap=newHashMapString,String

for(inti=0;ii++){

map.put(i+"",i+"");

//模擬加載一些別單例模式bean的數(shù)據(jù)初始化

ErrorMsgUtil1.getInstance().setMap(map);

ErrorMsgUtil2.getInstance().setMap(map);

好了,如果你開啟了spring的懶加載模式,而且InitData這個bean只是被掃描而沒有被注入,那么ErrorMsgUtil里的map永遠(yuǎn)是空的。

@PostConstruct實(shí)在bean初始化的時候被創(chuàng)建的,開啟了懶加載顯然如果InitData沒有被用到那么就一直不執(zhí)行了。

此坑已踩,小弟還是對spring理解不深,繼續(xù)學(xué)習(xí)。

ps:如何開啟spring的懶加載模式,在spring.xml中加上下面的代碼中最后一句即可

xmlversion="1.0"encoding="UTF-8"

beansxmlns="/schema/beans"

xmlns:xsi="/2001/XMLSchema-instance"xmlns:p="/schema/p"

xmlns:context="/schema/context"

xmlns:mvc="/schema/mvc"xmlns:tx="/schema/tx"

xsi:schemaLocation="

/schema/beans

/schema/beans/spring-beans-3.0.xsd

/schema/context

/schema/context/spring-context-3.0.xsd

"default-lazy-init="true"

遺留問題@PostConstruct注入不成功

前兩天做了個純java代碼的rabbitMQ監(jiān)聽多個ip的客戶端功能,由于用的不是配置方式的listener方式—博文中有這一節(jié),無法自動啟動。就用@PostConstruct來項(xiàng)目啟動時運(yùn)行監(jiān)聽mq,但是老遇到調(diào)用業(yè)務(wù)邏輯層方法時,注入不成功導(dǎo)致空指針異常。今天排查了一下,發(fā)現(xiàn)主要問題是框架掃包忽略了。

直接先說原因吧

1.忽略ssm本身對注解是通過掃包才讓注解有效的

!--自動掃描該包,支持注解的層限制,把a(bǔ)pi這個controller層排除在外了。另外多個包中間用逗號或者分號隔開都可以。--

context:component-scanbase-package="com.**.service,com.**.action,com.**.common"

context:include-filtertype="annotation"expression="org.springframework.stereotype.Controller"/

context:exclude-filtertype="annotation"expression="org.springframework.stereotype.api"/

/context:component-scan

2.忽略@Service的注解

由于掃包是掃service層和action層(相當(dāng)于service層),common工具層。所以在api層(相當(dāng)于controller層)用@Service和不用注解都是錯誤的,都會導(dǎo)致注入失敗。

3.注意掃包區(qū)間

出了這個范圍@PostConstruct是無效的。應(yīng)用在啟動時是不會走帶有這個注解的方法的。

4.@PostCoustruct注解用于

在依賴關(guān)系注入完成之后需要執(zhí)行的方法上,以執(zhí)行任何初始化。此方法所在的類必須放入服務(wù)之前調(diào)用。也就是該注解的類上不能隨便注解:經(jīng)驗(yàn)總結(jié)是能用@Service注解,不能用@Controller注解,否則啟動不會走這個方法。這個類定位為服務(wù)層/業(yè)務(wù)層。而不是控制層(web層)

有了上面說的注意點(diǎn)。我重新在工具類包c(diǎn)ommon包中寫了個測試類。然后spring配置文件上掃包范圍增加了這個common包。代碼如下:mon.cache.CommonCacheMap.java

packagemon.cache;

importjavax.annotation.PostConstruct;

importjavax.annotation.Resource;

importorg.springframework.stereotype.Service;

importcom.zlf.bo.StaffBo;

importcom.zlf.service.IStaffService;

@Service("CommonCacheMap")

publicclassCommonCacheMap{

@Resource

privateIStaffServicestaffService;

@PostConstruct

publicvoidgetOneStaff(){

StaffBostaffBo=staffService.selectByPrimaryKey(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論