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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

spring懶加載及@PostConstruct的坑

舉例說明:

下面是一個初始化數據的組件

@Component

publicclassInitData{

*初始化加載bean

@PostConstruct

publicvoidinit(){

MapString,Stringmap=newHashMapString,String

for(inti=0;ii++){

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

//模擬加載一些別單例模式bean的數據初始化

ErrorMsgUtil1.getInstance().setMap(map);

ErrorMsgUtil2.getInstance().setMap(map);

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

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

此坑已踩,小弟還是對spring理解不深,繼續學習。

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監聽多個ip的客戶端功能,由于用的不是配置方式的listener方式—博文中有這一節,無法自動啟動。就用@PostConstruct來項目啟動時運行監聽mq,但是老遇到調用業務邏輯層方法時,注入不成功導致空指針異常。今天排查了一下,發現主要問題是框架掃包忽略了。

直接先說原因吧

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

!--自動掃描該包,支持注解的層限制,把api這個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層(相當于service層),common工具層。所以在api層(相當于controller層)用@Service和不用注解都是錯誤的,都會導致注入失敗。

3.注意掃包區間

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

4.@PostCoustruct注解用于

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

有了上面說的注意點。我重新在工具類包common包中寫了個測試類。然后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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論