2017-08-27 36 views
1

的讓我們假設有下面的類訂單@PostConstruct和繼承

public abstract class AbstractFoo { 

    @PostConstruct 
    private void doIt() { 
     // 
    } 
} 

public class Foo extends AbstractFoo { 

    @PostConstruct 
    private void doIt() { 
     // 
    } 
} 

當AbstractFoo.doIt()和Foo.doIt()將被稱爲 - 是什麼順序?

+0

什麼阻止你簡單地嘗試它? – luk2302

+0

@ luk2302我想得到規範的答案。我搜索,但無法找到。 –

回答

3

@PostConstruct最後事情得到在給定的託管bean,相對於其繼承鏈中位置的初始化執行。從規格

容器必須確保:

由bean的類型分級中的類X聲明
  • 初始化方法(即@PostConstruct)是由X或聲明的所有注入域後調用由X的超類已經初始化。

  • 由bean的類型層次結構中的X類聲明的任何@PostConstruct回調稱爲通過X或X的超類中聲明的所有初始化方法被調用後,通過X或超聲明的所有注入域後的X已經初始化。

專業提示:與CDI 2.0,you can use @Inject to declare an initializer method作爲替代@PostConstruct,並且只能有一個給定的一個類的限制。這裏的區別是@PostConstruct仍然是最後執行,並且是唯一可以保證所有注入的組件都可用的地方。

+0

CDI 1.0中的初始化方法也可用! – Darsstar