2014-08-27 11 views
11

Có rất nhiều tùy chọn khởi tạo có sẵn trong vòng đời đậu mùa xuân.Mùa xuân: init-method, PostConstruct, afterPropertiesSet: khi nào sử dụng một cái khác?

init-phương pháp, PostConstruct chú thích, afterPropertiesSet, Bean hậu khởi và thậm chí lớp constructor. Tất cả những điều này có thể được sử dụng để khởi tạo một bean.

Tôi đã bối rối khi sử dụng một trong số này. Hơn nữa, có trường hợp nào chúng tôi có thể cần phải sử dụng tất cả các tùy chọn này trong một Bean duy nhất? Nếu có xin vui lòng ví dụ sẽ là tốt.

Thực sự mong nhận được một số câu trả lời tuyệt vời.

Trả lời

13

Sự khác biệt giữa việc sử dụng các nhà xây dựng và các tùy chọn khác là mã constructor là người đầu tiên được thực hiện, trong khi các tùy chọn khác sẽ chỉ được gọi sau phụ thuộc được tiêm vào đậu (hoặc từ @Autowired chú thích hoặc tệp XML).

Mã bạn viết trong hàm tạo sẽ chạy trong khi thuộc tính của bean vẫn chưa được khởi tạo. Tất cả các trường @Autowired sẽ là null. Đôi khi đây là những gì bạn muốn, nhưng thông thường bạn muốn mã chạy sau khi các thuộc tính được thiết lập.

Khác với điều này, tôi không thấy sự khác biệt, thứ tự sau đó của lệnh thực hiện. Tôi không nghĩ rằng có một trường hợp bạn sẽ muốn có tất cả các tùy chọn trong cùng một lớp học.

6

Tôi khuyên bạn chỉ nên sử dụng hàm tạo nếu có thể. Có một lý do rất hay để làm như vậy: kiểm tra

Khi bạn đến đơn vị kiểm tra một bean mùa xuân, bạn sẽ muốn có thể xây dựng lớp với độ ồn tối thiểu. Điều đó có nghĩa là bạn chỉ nên gọi cho nhà xây dựng, và không phải đối phó với việc gọi các phương thức vòng đời khác nhau theo cách riêng của bạn. Điều cuối cùng bạn muốn khi tạo lớp được kiểm tra là phải biết đối tượng được khởi tạo thuộc tính như thế nào.

Với sự hỗ trợ tiêm của hàm tạo Spring, bạn có thể dễ dàng chèn các hạt khác hoặc thuộc tính dự án vào hàm tạo để có thể bao quát hầu hết mọi trường hợp.

+0

Hầu hết mọi trường hợp, ngoại trừ trường hợp khi bạn không thể sử dụng phép xây dựng (nghĩa là phụ thuộc cyclic). Trong trường hợp này, cách duy nhất bạn có thể khởi tạo bean là '@ PostConstruct' và các lựa chọn thay thế của nó. – hoaz

+0

@hoaz Đúng là – geoand

+1

Tôi nghĩ điều này [tốt] Câu trả lời ngụ ý việc sử dụng "Constructor Injection", chỉ để được rõ ràng ... Và nếu bạn đi tuyến đường này, có lẽ không khôn ngoan để bổ sung thêm bất kỳ chú thích PostConstruct nào (http: //stackoverflow.com/a/3406690/1357094) trong cùng một lớp. Nếu nó vẫn còn, phương thức @PostConstruct sẽ không được gọi trong [ví dụ:] vanilla JUnit kiểm tra vì Spring không tham gia ở đó! – cellepo

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