2017-06-21 58 views
5

我是新來的春天,我想知道:@PostConstruct註釋和春天的生命週期

我有@Component(春季)註釋的Java類和裏面我有@PostConstruct註釋的方法。然後該類將由另一個類中的@Autowired註釋字段引用。我可以假設該類只在@PostConstruct被調用後才被注入?

@Component 
class AuthenticationMetrics { 

    private static final MetricRegistry metrics = new MetricRegistry(); 

    final Counter requestsTotal 

    final Meter guestLogins 

    final Meter kfUserLogins 

    final Timer guestLoginResponseTime 

    final Timer kfLoginResponseTime 

    @PostConstruct 
    public void populateMetricsRegistry() { 

    metrics.counter("authentication.requests.totals") 

    } 

} 
+1

是宥可以假設它... Spring首先創建一個bean,然後檢查最終@PostConstruct註釋,最後注入豆。無論如何,我看到您在populateMetricsRegistry方法中使用了非彈簧對象。在這種情況下,對於這個對象(度量對象),你自己負責管理正確的生命週期 –

+0

我對另一個class_很困惑。你的'AuthenticationMetrics'類將被實例化,它的字段將被注入(這個例子中沒有),然後'@ PostConstruct'將被調用。如果你在某處注入'AuthenticationMetrics',它將在_somewhere_的'@ PostConstrtuct'被調用之前被注入。 –

回答

7

如果你問的是某一類在豆@PostConstruct後發生的注入被調用,那麼答案是肯定的 - 之前,如果你問豆被認爲是「注射」

@PostConstruct執行如果給定bean上的@PostConstruct在完成所有注入(在同一個bean上)後執行 - 那麼在注入被提交給給定bean後執行是 - @PostConstruct。這就是它存在的原因。通常你可以把@PostConstruct動作放入構造函數中。但是,當創建新對象(調用構造函數)時,注入尚未執行 - 因此,由NPE導致依賴於注入對象的任何初始化都將失敗。這就是爲什麼你需要@PostConstruct

+1

嗨,是的,我問,如果@PostConstruct是在bean被認爲是「可注入的」之前執行的,那是我想知道的。謝謝! – Daniele

+0

你可以刪除這部分:「如果你問是否@PostConstruct執行意味着這個bean被注入了某處 - 那麼不是。」我會接受答案。 – Daniele

3

@PostConstruct@Resource@PreDestroy通過的BeanPostProcessor做註解的處理,在這種情況下CommonAnnotationBeanPostProcessor。您可以在Spring的下圖中看到,這些BPP在依賴注入之後處理,但之前Bean Ready For Use(這意味着儘可能多注入)。

enter image description here