簡體   English   中英

@Autowired在@Service?

[英]@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個解決方案

  1. 將代碼從構造函數移動到使用@PostConstruct注釋的方法
  2. 更改默認的no-arg構造函數以獲取參數並使用它來執行依賴注入而不是@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM