Dalam kacang yang dikelola, @PostConstruct
dipanggil setelah konstruktor objek Java biasa.
Mengapa saya gunakan @PostConstruct
untuk menginisialisasi dengan kacang, bukan konstruktor biasa itu sendiri?
Dalam kacang yang dikelola, @PostConstruct
dipanggil setelah konstruktor objek Java biasa.
Mengapa saya gunakan @PostConstruct
untuk menginisialisasi dengan kacang, bukan konstruktor biasa itu sendiri?
final
. Mengingat pola itu, mengapa@PostConstruct
ditambahkan ke J2EE - mereka pasti melihat use case lain pasti?Jawaban:
karena ketika konstruktor dipanggil, kacang belum diinisialisasi - yaitu tidak ada ketergantungan yang disuntikkan. Dalam
@PostConstruct
metode kacang sepenuhnya diinisialisasi dan Anda dapat menggunakan dependensi.karena ini adalah kontrak yang menjamin bahwa metode ini akan dipanggil hanya sekali dalam siklus hidup kacang. Mungkin terjadi (walaupun tidak mungkin) bahwa sebuah kacang dipakai berkali-kali oleh wadah dalam pekerjaan internalnya, tetapi itu menjamin bahwa
@PostConstruct
akan dipanggil hanya sekali.sumber
Masalah utamanya adalah:
* jelas tidak termasuk Injeksi Konstruktor
Contoh dunia nyata:
PENTING :
@PostConstruct
dan@PreDestroy
telah sepenuhnya dihapus di Jawa 11 .Untuk tetap menggunakannya, Anda harus menambahkan Javax.annotation-api JAR ke dependensi Anda.
Maven
Gradle
sumber
in a constructor, the injection of the dependencies has not yet occurred.
benar dengan setter atau injeksi lapangan, tetapi tidak benar dengan injeksi konstruktor.Jika kelas Anda melakukan semua inisialisasi di konstruktor, maka
@PostConstruct
memang berlebihan.Namun, jika kelas Anda memiliki dependensi yang disuntikkan menggunakan metode setter, maka konstruktor kelas tidak dapat sepenuhnya menginisialisasi objek, dan kadang-kadang beberapa inisialisasi perlu dilakukan setelah semua metode setter dipanggil, maka kasus penggunaan
@PostConstruct
.sumber
Pertimbangkan skenario berikut:
Karena Mobil harus dipakai sebelum injeksi lapangan, mesin titik injeksi masih nol selama pelaksanaan konstruktor, menghasilkan NullPointerException.
Masalah ini dapat dipecahkan dengan JSR-330 Dependency Injection untuk Java constructor injection atau JSR 250 Annotations untuk anotasi metode Java @PostConstruct.
@PostConstruct
JSR-250 mendefinisikan seperangkat penjelasan umum yang telah dimasukkan dalam Java SE 6.
Anotasi @PostConstruct memungkinkan definisi metode yang akan dieksekusi setelah instantiated dan semua injeksi telah dilakukan.
Alih-alih melakukan inisialisasi dalam konstruktor, kode tersebut dipindahkan ke metode yang dijelaskan dengan @PostConstruct.
Pemrosesan metode pasca-konstruksi adalah masalah sederhana untuk menemukan semua metode yang dijelaskan dengan @PostConstruct dan menjalankannya secara bergantian.
Pemrosesan metode pasca-konstruksi harus dilakukan setelah instantiasi dan injeksi selesai.
sumber
Juga inisialisasi berdasarkan konstruktor tidak akan berfungsi sebagaimana dimaksud setiap kali semacam proxy atau remoting terlibat.
Ct akan dipanggil setiap kali EJB akan deserialized, dan setiap kali proxy baru dibuat untuk itu ...
sumber