2013-05-14 34 views
16

Trong chế độ xem của tôi được quản lýBean, tôi cần điền một danh sách có dữ liệu từ DB. Im làm điều này thông qua một cuộc gọi trực tiếp từ các nhà xây dựng, một cái gì đó như thế này:JSF - sự khác nhau giữa @PostConstruct và gọi phương thức trực tiếp từ hàm tạo là gì?

public MyClass(){ 
    list=populateFromDb(); 
} 

nhưng phương pháp này có thể được gọi trong một phương pháp @PostConstruct chú thích, như:

public MyClass(){ 
} 

@PostConstruct 
populateFromDb(){...} 

sự khác biệt giữa những gì là điều này?

+1

[Tại sao sử dụng @PostConstruct?] (Http://stackoverflow.com/q/3406555/1055089) – Vrushank

Trả lời

35

Nếu bean có phạm vi yêu cầu, @PostConstruct sẽ được thực thi mỗi lần. Nó sẽ được gọi sau khi bean được quản lý được khởi tạo, nhưng trước khi đậu được đặt trong phạm vi. Phương thức như vậy không có đối số, trả về void và có thể không khai báo một ngoại lệ đã kiểm tra được ném. Phương thức có thể công khai, được bảo vệ, riêng tư hoặc gói riêng tư. Nếu phương thức ném một ngoại lệ không được kiểm tra, việc thực thi JSF không được đặt bean được quản lý vào dịch vụ và không có thêm phương pháp nào về cá thể bean được quản lý sẽ được gọi.

public TrainingClassForm() { 

    } 
    @PostConstruct 
    public void init() { 
     if (this.trainingListModel.getListDataModel() != null) { 
      this.trainingListModel.getAllTrainingClasses(); 
     } 

    } 


reffering bạn this question of stack
Trong một bean được quản lý, @PostConstruct được gọi sau khi các nhà xây dựng đối tượng Java thông thường.
khi hàm tạo được gọi, bean chưa được khởi tạo - nghĩa là không có phụ thuộc nào được tiêm. Trong phương pháp @PostConstruct đậu được khởi tạo đầy đủ và bạn có thể sử dụng phụ thuộc

@PostConstruct là hợp đồng mà đảm bảo rằng phương pháp này sẽ được gọi chỉ một lần trong vòng đời đậu. Nó có thể xảy ra (mặc dù không chắc) rằng một hạt được instantiated nhiều lần bởi container trong nội bộ của nó làm việc, nhưng nó đảm bảo rằng @PostConstruct sẽ được gọi chỉ một lần.
Nếu lớp học của bạn thực hiện tất cả khởi tạo của nó trong hàm tạo, thì @PostConstruct thực sự là thừa.
Tuy nhiên, nếu lớp của bạn có các phụ thuộc được chèn bằng phương thức setter, thì hàm khởi tạo của lớp không thể khởi tạo hoàn toàn đối tượng và đôi khi một số khởi tạo cần được thực hiện sau khi tất cả các phương thức setter đã được gọi, do đó trường hợp sử dụng là @PostConstruct
Ngoài ra see thisthis

+0

cộng với một từ phía của tôi. Nếu tôi muốn khởi tạo một trường inputtext với một giá trị được lấy từ cơ sở dữ liệu, tôi có thể làm điều đó với sự trợ giúp của PostConstruct, nhưng thất bại khi cố gắng thực hiện tương tự bên trong hàm tạo. Tôi có yêu cầu này để khởi tạo mà không cần sử dụng PostContruct. Nếu bạn có thời gian, bạn có thể vui lòng trả lời câu hỏi này không: http://stackoverflow.com/questions/27540573/how-to-initialize-inputtextfield-with-a-value-from-database-on-runtime-without-t –

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