2017-06-21 28 views
5

Tôi mới đến mùa xuân, tôi muốn biết:@PostConstruct chú thích và mùa xuân vòng đời

Tôi có một lớp java chú thích với @Component (mùa xuân) và bên trong tôi có một phương pháp chú thích với @PostConstruct. Lớp này sau đó được tham chiếu bởi trường @Autowired được chú thích trong một lớp khác. Tôi có thể giả định rằng lớp này chỉ được tiêm sau khi @PostConstruct được gọi không?

@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

Có yuo có thể giả định nó ... Mùa xuân đầu tiên tạo ra đậu, sau đó kiểm tra @PostConstruct chú thích cuối cùng và cuối cùng là tiêm đậu. Tôi thấy, trong mọi trường hợp, rằng bạn đang sử dụng một đối tượng không mùa xuân trong phương thức populateMetricsRegistry. Trong trường hợp này đối tượng này (đối tượng số liệu) đó là trách nhiệm của riêng bạn để quản lý vòng đời chính xác –

+0

Tôi đang bối rối về _another class_. Lớp 'AuthenticationMetrics' của bạn sẽ được khởi tạo, các trường của nó sẽ được tiêm (không có trong mẫu này), sau đó' @ PostConstruct' sẽ được gọi. Nếu bạn đang tiêm 'AuthenticationMetrics' ở đâu đó, nó sẽ được tiêm trước khi' @ PostConstrtuct' của _somewhere_ được gọi ra. –

Trả lời

7

Nếu bạn đang yêu cầu là tiêm lớp trao xảy ra sau khi @PostConstruct trong đậu mà được gọi, thì câu trả lời là có - @PostConstruct được thực hiện trước khi đậu được coi là "tiêm"

Nếu bạn đang yêu cầu nếu @PostConstruct trên đậu đã cho được thực hiện sau khi tất cả các mũi tiêm đã được thực hiện (trên cùng một hạt) - thì có - @PostConstruct được thực hiện sau khi tiêm được cam kết cho đậu. Đây là lý do nó tồn tại. Thông thường, bạn có thể đặt các hành động @PostConstruct vào hàm tạo. Tuy nhiên, khi đối tượng mới được tạo (constructor được gọi) thì việc tiêm không được thực hiện - vì vậy bất kỳ khởi tạo nào phụ thuộc vào các đối tượng được tiêm sẽ thất bại do NPE. Đó là lý do tại sao bạn cần @PostConstruct

+1

Xin chào, vâng, tôi hỏi liệu @PostConstruct có được thực hiện trước khi bean được coi là "có thể tiêm" được không, đó là điều tôi muốn biết. Cảm ơn! – Daniele

+0

bạn có thể loại bỏ phần này: "Nếu bạn hỏi xem việc thực thi @PostConstruct có nghĩa là đậu được tiêm ở đâu đó - thì không." Tôi sẽ chấp nhận câu trả lời. – Daniele

3

Việc xử lý các chú thích như @PostConstruct, @Resource, @PreDestroy được thực hiện thông qua một BeanPostProcessor, trong trường hợp này CommonAnnotationBeanPostProcessor. Bạn có thể thấy trong sơ đồ sau đây từ Mùa xuân rằng các BPP này được xử lý sau Tiêm phụ thuộc nhưng trướcBean Ready For Use (Điều này có nghĩa là nhiều nhất có thể tiêm).

enter image description here

Các vấn đề liên quan