[英]@Autowired in @Service?
我無法讓@Autowired在@Service注釋的類中工作,自動變量始終為null。 讓我解釋:
@Service
public class Searcher extends Thread implements ISearcher {
@Autowired
protected ISessionProvider sessionProvider; <-- always null
...
public Searcher() {
sessionProvider.doSomeStuff();
}
sessionProvider總是為null。
奇怪的是@Controller中的相同autowire確實有效:
@Controller
@RequestMapping("/search")
@Secured({ "ROLE_USER" })
public class SearchController extends BaseController {
@Autowired
protected ISessionProvider sessionProvider; <-- does work
@Autowired
protected ISearcher searcher;
最后一行拋出異常,因為Searcher的構造函數(實現ISearcher)試圖訪問sessionProvider,它是null。
我不確定我可能做錯了什么,看起來Spring並沒有自動裝配Searcher中的ISessionProvider。
可能是春天首先在SearchController中自動裝配Searcher,但它應首先在Searcher中自動裝配SessionProvider,然后在SearchController中自動裝配Searcher。 如果沒有有效的SessionProvider,則無法自動裝配搜索者。 困惑我的大腦;-)
有人可以提供幫助大腦嗎?
[編輯]
Spring將首先創建bean實例,然后注入bean。 您正在嘗試在創建當前bean時訪問注入的bean,因此bean將為null
。 這是默認行為。
如果您希望/需要在創建bean之后執行任何邏輯,請使用@PostConstruct
修飾方法,該方法在創建bean並注入所有依賴項后調用。 這是一個示例:
@Service
public class Searcher extends Thread implements ISearcher {
@Autowired
protected ISessionProvider sessionProvider;
public Searcher() {
//nothing should be here...
}
@PostConstruct
public void init() {
sessionProvider.doSomeStuff();
}
}
在構造bean之后,Spring只能進行依賴注入。 您正在構造函數中調用該方法,此時ISessionProvider
尚未注入,因此它為null
,這反過來導致一個很好的NullPointerException
。
你有2個解決方案
@PostConstruct
注釋的方法 @Autowired field
。 解決方案1:將該代碼移動到使用@PostConstruct
注釋的方法。
@Service
public class Searcher extends Thread implements ISearcher {
@Autowired
protected ISessionProvider sessionProvider;
...
public Searcher() {}
@PostConstruct
public void init() {
sessionProvider.doSomeStuff();
}
解決方案2:使用基於構造函數的依賴注入。
@Service
public class Searcher extends Thread implements ISearcher {
protected final ISessionProvider sessionProvider;
@Autowired
public Searcher(ISessionProvider sessionProvider) {
this.sessionProvider=sessionProvider;
sessionProvider.doSomeStuff();
}
}
我沒有做測試,但我認為問題是,在Searcher
類中,你創建了一個無參數構造函數,並且你使用了“autowired”bean。 我想你會得到NPE。 如果你沒有指定一個,那么spring將使用默認構造函數(通過反射)實例化你的Searcher
,也就是說,它將使用你創建的無參數構造函數,但此時,“autowired”bean還沒有被注入。
如果要在實例化bean之后立即執行某些操作,可以將邏輯代碼包裝在方法中,並使用@PostConstruct
注釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.