Baru -baru ini, ketika saya melihat metode templat JDBCtempleTe Spring, saya menjadi sangat tertarik pada templat dan panggilan balik, dan saya meminta beberapa informasi dan membuat beberapa ringkasan.
Fungsi panggilan balik:
Yang disebut panggilan balik berarti bahwa program klien C memanggil fungsi tertentu dalam program layanan, dan kemudian S memanggil fungsi B tertentu dalam C pada suatu waktu. Untuk C, B ini disebut fungsi panggilan balik. Fungsi callback hanyalah fungsi yang diimplementasikan oleh pengguna sesuai dengan konvensi panggilan callback fungsi. Fungsi panggilan balik adalah bagian dari alur kerja, dan alur kerja menentukan waktu panggilan fungsi (callback). Secara umum, C tidak akan menelepon B dengan sendirinya. Tujuan C menyediakan B adalah untuk membiarkan S memanggilnya, dan C harus menyediakannya. Karena S tidak tahu siapa B yang dinamai C setelah C, S akan menyetujui spesifikasi antarmuka B (Fungsi Prototipe), dan kemudian C akan memberi tahu S sebelumnya bahwa ia akan menggunakan fungsi B melalui fungsi R S. Proses ini disebut pendaftaran fungsi callback, dan R disebut fungsi pendaftaran. Layanan Web dan Java RMI Gunakan mekanisme panggilan balik untuk mengakses program server jarak jauh. Fungsi callback berisi karakteristik berikut:
1. Milik bagian dari alur kerja;
2. Itu harus dinyatakan (didefinisikan) sesuai dengan konvensi panggilan yang ditentukan oleh alur kerja;
3. Waktu panggilannya ditentukan oleh alur kerja. Pelaksana fungsi panggilan balik tidak dapat secara langsung memanggil fungsi callback untuk mengimplementasikan fungsi alur kerja;
Mekanisme panggilan balik:
Mekanisme panggilan balik adalah model desain umum. Ini memperlihatkan fungsi dalam alur kerja ke pengguna eksternal sesuai dengan antarmuka yang disepakati, menyediakan data kepada pengguna eksternal, atau mengharuskan pengguna eksternal untuk menyediakan data.
Mekanisme Callback Java:
Selalu ada antarmuka tertentu antara modul perangkat lunak. Dalam hal metode panggilan, mereka dapat dibagi menjadi tiga kategori: panggilan sinkron, panggilan balik dan panggilan asinkron.
Panggilan Sinkron: Panggilan pemblokiran, penelepon harus menunggu pihak lain menyelesaikan eksekusi sebelum kembali. Ini adalah panggilan satu arah;
Callback: Mode panggilan dua arah, yaitu, pihak yang dipanggil juga akan memanggil antarmuka pihak lain ketika antarmuka dipanggil;
Panggilan asinkron: Mekanisme yang mirip dengan pesan atau peristiwa, tetapi arah panggilannya justru sebaliknya. Ketika layanan antarmuka menerima pesan tertentu atau peristiwa terjadi, itu akan secara aktif memberi tahu klien (yaitu, hubungi antarmuka klien).
Hubungan antara panggilan balik dan panggilan asinkron sangat terkait: Callback digunakan untuk mengimplementasikan pendaftaran pesan asinkron, dan pemberitahuan pesan dicapai melalui panggilan asinkron.
Instance callback
1. Antarmuka Callback
callback antarmuka publik {string callback (); } 2. Penelepon
kelas publik lain {private callback callback; // Memanggil metode yang mengimplementasikan kelas public void setCallback (callback callback) {this.callback = callback; } // Saat bisnis membutuhkannya, hubungi metode spesifik yang mengimplementasikan kelas public void docAllBack () {System.out.println (callback.callback ()); }} 3. Fungsi Callback Tes
Public Class TestCallCack {public static void main (string [] args) {// Buat kelas implementasi penelepon lain lain = baru lain (); // Daftarkan antarmuka kembali ke kelas implementasi Other.setCallback (new callback () {@Override public string callback () {return "You Are a Pig";}}); // jalankan fungsi callback lain.docallback (); }}Penggunaan metode panggilan balik biasanya terjadi selama penggunaan "antarmuka java" dan "kelas abstrak". Pola Desain Metode Template menggunakan Metode Mekanisme Callback. Pola ini pertama -tama mendefinisikan kerangka algoritma langkah -langkah tertentu dan menunda beberapa langkah pada pola desain yang diimplementasikan dalam subkelas. Pola desain metode templat memungkinkan subkelas untuk mendefinisikan kembali langkah -langkah spesifik tertentu dari suatu algoritma tanpa mengubah struktur suatu algoritma.
Penerapan Pola Desain Templat:
1. Menerapkan bagian algoritma yang tidak berubah pada satu waktu dan meninggalkan algoritma variabel ke subkelas untuk mengimplementasikannya.
2. Perilaku publik di setiap subkelas harus diekstraksi dan terkonsentrasi di kelas orang tua publik untuk menghindari duplikasi kode.
3. Ekstensi subkelas dapat dikontrol.
Contoh template:
Kelas Metode Template Abstrak:
Kelas Abstrak Publik AbstractSup {// Metode yang membutuhkan implementasi subkelas abstrak void print (); // metode template public void doprint () {System.out.println ("Jalankan metode template"); untuk (int i = 0; i <3; i ++) {print (); }}} Kelas Metode Templat Implementasi Subkelas:
Subkelas kelas publik memperluas abstrak abstrak {@override public void print () {System.out.println ("Metode implementasi subkelas"); }} Templat Metode Tes Kelas:
kelas publik templeTetest {public static void main (string [] args) {subclass subclass = new subclass (); subclass.print (); subclass.doprint (); }} Berikut ini adalah pengantar terperinci untuk penggunaan metode template pegas. Mengambil jdbctempleTe sebagai contoh, kami akan menjelaskan secara rinci penggunaan mode templat dan mekanisme panggilan balik.
Pertama, mari kita lihat contoh pemrograman JDBC klasik:
Daftar Publik <User> query () {List <User> userList = new ArrayList <User> (); String sql = "pilih * dari pengguna"; Koneksi con = null; Persiapan PST = NULL; Hasil rs = null; coba {con = hsqldbutil.getConnection (); pst = con.preparestatement (sql); RS = PST.ExecuteQuery (); Pengguna pengguna = null; while (rs.next ()) {user = new user (); user.setid (rs.getint ("id")); user.setUserName (rs.getString ("user_name")); user.setBirth (rs.getDate ("lahir")); user.setCreateDate (rs.getDate ("create_date")); userlist.add (pengguna); }} catch (sqlexception e) {e.printstacktrace (); } akhirnya {if (rs! = null) {coba {rs.close (); } catch (sqlexception e) {e.printstacktrace (); }} coba {pst.close (); } catch (sqlexception e) {e.printstacktrace (); } coba {if (! con.isclosed ()) {coba {con.close (); } catch (sqlexception e) {e.printstacktrace (); }}} catch (sqlexception e) {e.printstacktrace (); }} kembalikan daftar pengguna; }
Kueri sederhana membutuhkan banyak hal dan juga menangani pengecualian. Mari kita selesaikan jika kita tidak mau:
1. Dapatkan koneksi
2. Dapatkan pernyataan
3. Dapatkan Hasil
4. Iterasi melalui hasil dan merangkumnya ke dalam koleksi
5. Tutup koneksi, pernyataan, dan hasil pada gilirannya, dan pertimbangkan berbagai pengecualian, dll.
Jika beberapa kueri akan menghasilkan lebih banyak kode duplikat, Anda dapat menggunakan mekanisme template. Melalui pengamatan, kami menemukan bahwa sebagian besar langkah di atas berulang dan dapat digunakan kembali. Hanya ketika melintasi hasil dan merangkumnya ke dalam koleksi dapat disesuaikan, karena setiap tabel memetakan kacang java yang berbeda. Tidak ada cara untuk menggunakan kembali bagian kode ini, itu hanya dapat disesuaikan.
Kode Kelas Abstrak:
kelas abstrak publik jdbctemplate {// metode template execute objek akhir publik (string sql) melempar sqlexception {koneksi con = hsqldbutil.getConnection (); Pernyataan stmt = null; coba {stmt = con.createStatement (); Hasil rs = stmt.executeQuery (sql); Hasil Objek = DoInstatement (RS); // Metode Abstrak (Metode Kustomisasi, Implementasi Subkelas Diperlukan) Hasil Pengembalian; } catch (sqlexception ex) {ex.printstacktrace (); lempar ex; } akhirnya {coba {stmt.close (); } catch (sqlexception e) {e.printstacktrace (); } coba {if (! con.isclosed ()) {coba {con.close (); } catch (sqlexception e) {e.printstacktrace (); }}} catch (sqlexception e) {e.printstacktrace (); }}} // metode abstrak (metode khusus) objek abstrak yang dilindungi doinstatement (hasil rs); }Dalam kelas abstrak ini, proses utama API Sun JDBC dienkapsulasi, dan langkah melintasi hasil yang ditempatkan dalam metode abstrak doinstatement (), yang diimplementasikan oleh subclass.
Kode Implementasi Subkelas:
kelas publik JDBCtemplateUserImpl memperluas jdbctemplate {@Override Objek Protected DoInstatement (hasil RS) {Daftar <User> userList = ArrayList baru <user> (); coba {pengguna pengguna = null; while (rs.next ()) {user = new user (); user.setid (rs.getint ("id")); user.setUserName (rs.getString ("user_name")); user.setBirth (rs.getDate ("lahir")); user.setCreateDate (rs.getDate ("create_date")); userlist.add (pengguna); } kembalikan daftar pengguna; } catch (sqlexception e) {e.printstacktrace (); kembali nol; }}}Dalam metode doinstatement (), kami melintasi hasil dan akhirnya mengembalikannya.
Kode Uji:
String sql = "pilih * dari pengguna"; Jdbctemplate jt = jdbctemplateUserImpl baru (); Daftar <User> userList = (Daftar <User>) JT.Execute (SQL);
Mekanisme template telah digunakan sejauh ini, tetapi jika Anda perlu mewarisi kelas induk setiap kali Anda memanggil jdbctemplate, itu cukup merepotkan, sehingga mekanisme panggilan balik dapat memainkan peran.
Callback yang disebut berarti melewati antarmuka dalam parameter metode. Ketika kelas induk memanggil metode ini, ia harus memanggil kelas implementasi antarmuka yang dilewati dalam metode.
Implementasi Mode Callback Plus Plus Template
Antarmuka Callback:
Pernyataan Antarmuka PublikCallback {objek doInstatement (pernyataan stmt) melempar sqlexception; } Metode Template:
kelas publik jdbctemplate {// metode template public final objek Execute (Tindakan SATIMAN) Lempar SQlexception {Connection con = hsqldbutil.getConnection (); Pernyataan stmt = null; coba {stmt = con.createStatement (); Hasil objek = action.doinstatement (rs); // metode pengembalian metode panggilan balik; } catch (sqlexception ex) {ex.printstacktrace (); lempar ex; } akhirnya {coba {stmt.close (); } catch (sqlexception e) {e.printstacktrace (); } coba {if (! con.isclosed ()) {coba {con.close (); } catch (sqlexception e) {e.printstacktrace (); }}} catch (sqlexception e) {e.printstacktrace (); }}}} kueri objek publik (Pernyataan STMT STMT) melempar SQLException {return execute (stmt); }}} Kelas yang Diuji:
Public Object Query (String Final SQL) Melempar SQLEXCEPTION {class queryStatementCallback mengimplementasikan PernyataanCallback {objek publik DoInstatement (Pernyataan STMT) melempar SQlexception {hasil rs = stmt.executequery (sql); Daftar <User> userList = new ArrayList <User> (); Pengguna pengguna = null; while (rs.next ()) {user = new user (); user.setid (rs.getint ("id")); user.setUserName (rs.getString ("user_name")); user.setBirth (rs.getDate ("lahir")); user.setCreateDate (rs.getDate ("create_date")); userlist.add (pengguna); } kembalikan daftar pengguna; }} Jdbctemplate jt = new jdbctemplate (); return JT.Query (querystatementCallback baru ()); }
Mengapa Spring tidak menggunakan metode templat tradisional, tetapi juga bekerja sama dengan callback?
Bayangkan saja, jika ada 10 metode abstrak di kelas induk dan semua subkelas yang mewarisi itu perlu menerapkan semua 10 metode abstrak ini, subclass akan tampak sangat kembung. Terkadang, apa yang harus saya lakukan jika subclass hanya perlu menyesuaikan metode tertentu di kelas induk? Saat ini, panggilan balik digunakan.
Selain itu, metode di atas pada dasarnya mengimplementasikan metode Template Metode + Mode Callback. Tapi itu masih sedikit jauh dari JDBCtemplate Spring. Meskipun kami menerapkan metode Template + Mode Callback di atas, tampaknya sedikit "jelek" dibandingkan dengan JDBCtemplate Spring. Spring memperkenalkan konsep RowMapper dan HasilSetExtractor. Antarmuka Rowmapper bertanggung jawab untuk memproses deretan data tertentu. Misalnya, kami dapat beroperasi pada baris catatan tertentu dalam metode MapRow, atau merangkumnya menjadi entitas. Extractor Extractor Dataset adalah Extractor, yang bertanggung jawab untuk melintasi hasil dan memproses data sesuai dengan aturan dalam RowMapper. Perbedaan antara RowMapper dan hasil yang dikeluarkan adalah bahwa Rowmapper memproses deretan data tertentu dan mengembalikan objek entitas. HasilSetExtractor memproses kumpulan data dan mengembalikan kumpulan objek.
Tentu saja, hal di atas hanyalah prinsip -prinsip dasar implementasi Spring Jdbctemplate. Spring JDBCtemplate telah melakukan lebih banyak hal, seperti merangkum semua operasi dasar ke dalam antarmuka operasi JDBC, dan menggunakan JDBCAccessor untuk mengelola DataSource dan pengecualian konversi.
Di atas adalah semua tentang artikel ini, saya harap ini akan membantu untuk pembelajaran semua orang.