JavaRush /Blog Java /Random-MS /Musim bunga adalah untuk orang yang malas. Asas, konsep a...

Musim bunga adalah untuk orang yang malas. Asas, konsep asas dan contoh dengan kod. Bahagian 1

Diterbitkan dalam kumpulan
Ramai orang, selepas membaca artikel saya tentang mencipta templat untuk projek web dan tentang mencipta perkhidmatan web mudah menggunakan servlets , tertanya-tanya bila saya akan menulis tentang Spring. Saya tidak mahu, saya mencadangkan membaca buku (dan saya masih mengatakan bahawa buku lebih baik daripada 10, atau bahkan 100 artikel di Internet). Tetapi sekarang saya telah memutuskan bahawa menjelaskan perkara yang sama kepada orang yang berbeza, saya menghabiskan lebih banyak masa berbanding jika saya duduk sekali dan menulis artikel, dan kemudian hanya menyiarkan pautan kepadanya. Jadi saya menulis demi pautan itu)). Musim bunga adalah untuk orang yang malas.  Asas, konsep asas dan contoh dengan kod.  Bahagian 1 - 1Dalam artikel ini saya tidak akan menulis cara membuat projek yang berfungsi di Spring dalam masa 5 minit mengikut contoh saya. Saya hanya akan menulis tentang perkara asas, tanpa pengetahuan yang pastinya mungkin untuk memulakan projek, tetapi apa yang berlaku di sana, dan, yang lebih penting, mengapa, tidak akan jelas.

Apakah Rangka Kerja Musim Bunga?

Spring Framework , atau ringkasnya Spring , ialah salah satu rangka kerja yang paling popular untuk mencipta aplikasi web dalam Java. Rangka kerja adalah sesuatu yang serupa dengan perpustakaan (mungkin istilah ini lebih biasa kepada anda), tetapi ada satu perkara. Secara kasarnya, menggunakan perpustakaan, anda hanya mencipta objek kelas yang ada di dalamnya, memanggil kaedah yang anda perlukan, dan dengan itu mendapatkan hasil yang anda perlukan. Iaitu, terdapat pendekatan yang lebih penting: anda dengan jelas menunjukkan dalam program anda pada masa tertentu yang anda perlukan untuk mencipta objek mana, pada masa yang anda perlukan untuk memanggil kaedah tertentu, dsb. Dengan rangka kerja, perkara adalah sedikit berbeza. Anda hanya menulis beberapa kelas anda sendiri, tulis beberapa bahagian logik di sana, dan rangka kerja itu sendiri mencipta objek kelas anda dan kaedah panggilan untuk anda. Selalunya, kelas anda melaksanakan beberapa antara muka daripada rangka kerja atau mewarisi beberapa kelas daripadanya, dengan itu menerima beberapa fungsi yang telah ditulis untuk anda. Tetapi ia tidak semestinya begitu. Pada Musim Bunga, sebagai contoh, mereka cuba untuk menjauhkan diri daripada gandingan yang ketat sedemikian sebanyak mungkin (apabila kelas anda bergantung secara langsung pada beberapa kelas/antara muka daripada rangka kerja ini), dan menggunakan anotasi untuk tujuan ini. Kami akan kembali ke titik ini kemudian. Tetapi adalah penting untuk memahami bahawa Spring hanyalah satu set beberapa kelas dan antara muka yang telah ditulis untuk anda :) Saya juga ingin segera ambil perhatian bahawa Spring boleh digunakan bukan sahaja untuk aplikasi web, tetapi juga untuk konsol yang paling biasa. aplikasi yang begitu biasa dengan program kita semua Dan hari ini kita akan menulis sesuatu seperti itu.

Struktur

Tetapi Spring bukanlah satu rangka kerja khusus. Ini agak nama umum untuk beberapa rangka kerja kecil, setiap satunya melakukan beberapa jenis kerja yang berbeza.
Musim bunga adalah untuk orang yang malas.  Asas, konsep asas dan contoh dengan kod.  Bahagian 1 - 2
Seperti yang anda lihat, spring mempunyai struktur modular. Ini membolehkan kami menyambungkan hanya modul yang kami perlukan untuk aplikasi kami dan bukan menyambung modul yang kami jelas tidak akan gunakan. Setahu saya, pendekatan inilah yang membantu Spring mengatasi pesaingnya pada masa itu (EJB) dan mendahului. Kerana aplikasi yang menggunakan EJB menarik banyak kebergantungan dengan mereka, dan secara umum mereka ternyata lambat dan kekok. Imej menunjukkan bahawa rangka kerja spring terdiri daripada beberapa modul:
  • capaian data;
  • web;
  • teras;
  • dan lain lain.
Hari ini kita akan berkenalan dengan beberapa konsep modul utama, seperti: kacang, konteks dan lain-lain. Seperti yang anda mungkin rasa, modul akses data mengandungi alat untuk bekerja dengan data (terutamanya pangkalan data), web - untuk bekerja pada rangkaian (termasuk untuk membuat aplikasi web, yang akan dibincangkan kemudian). Selain itu, terdapat juga apa yang dipanggil infrastruktur Spring keseluruhan: banyak projek lain yang tidak disertakan secara rasmi dalam rangka kerja itu sendiri, tetapi disepadukan dengan lancar ke dalam projek Spring anda (contohnya, keselamatan musim bunga yang sama untuk bekerja dengan kebenaran pengguna pada tapak, yang, saya harap, kita juga akan rasa suatu hari nanti).

Mengapa Spring di Jawa?

Nah, selain fakta bahawa ia bergaya, bergaya dan awet muda, saya boleh dengan serta-merta mengatakan bahawa sebaik sahaja anda menguasainya walaupun sedikit, anda akan memahami betapa banyak kerja berbeza yang anda tidak perlu lakukan sekarang, dan berapa banyak Spring mengambil alih. Anda boleh menulis beberapa dozen baris konfigurasi, menulis beberapa kelas - dan anda akan mendapat projek yang berfungsi. Tetapi sebaik sahaja anda mula berfikir tentang berapa banyak yang ada "di bawah hud", berapa banyak kerja yang sedang dilakukan, dan berapa banyak kod yang perlu ditulis jika anda melakukan projek yang sama pada servlet kosong atau pada soket dan Java tulen - rambut anda berdiri tegak :) Malah terdapat ungkapan sedemikian: seperti "sihir" Spring. Ini adalah apabila anda melihat bahawa segala-galanya berfungsi, tetapi anda kira-kira berapa banyak yang mesti berlaku di sana untuk segala-galanya berfungsi dan bagaimana ia berfungsi di sana - maka nampaknya semua ini berlaku terima kasih kepada sejenis sihir yang sebenarnya)) Lebih mudah untuk panggil semuanya sihir daripada cuba terangkan bagaimana semuanya saling berkaitan di sana. :) Nah, hujah kedua "untuk" belajar Spring ialah dalam kira-kira 90% kekosongan jawatan untuk junior (menurut pemerhatian peribadi saya), sama ada pengetahuan atau sekurang-kurangnya idea umum set lelaki Spring from data, web-mvcdan security:) diperlukan hanya asas.

DI/IoC

Jika anda cuba membaca sesuatu pada Spring, maka perkara pertama yang anda temui mungkin adalah huruf ini: DI/IoC . Sekarang saya sangat mengesyorkan agar anda berehat dari artikel ini dan membaca artikel ini tentang Habré ! IoC (Penyongsangan Kawalan) - penyongsangan kawalan. Saya telah menyebut ini secara sepintas lalu apabila saya menulis bahawa apabila menggunakan perpustakaan, anda sendiri menulis dalam kod anda kaedah mana objek untuk dipanggil, dan dalam kes rangka kerja, selalunya rangka kerja akan memanggil kod yang anda tulis di sebelah kanan seketika. Iaitu, di sini anda tidak lagi mengawal proses melaksanakan kod/program, tetapi rangka kerja melakukannya untuk anda. Anda memindahkan kawalan kepadanya (penyongsangan kawalan). DI difahami sama ada sebagai Penyongsangan Ketergantungan (penyongsangan kebergantungan, iaitu , percubaan untuk tidak membuat sambungan keras antara modul/kelas anda, di mana satu kelas terikat secara langsung dengan yang lain), atau Suntikan Ketergantungan (suntikan kebergantungan, ini adalah apabila objek kucing tidak dicipta oleh anda dalam utama dan kemudian anda menyampaikannya kepada kaedah anda, dan Spring menciptanya untuk anda, dan anda hanya memberitahunya sesuatu seperti "Saya mahu mendapatkan kucing di sini" dan dia menyampaikannya kepada anda dalam kaedah anda). Kami akan lebih kerap menemui yang kedua dalam artikel selanjutnya.

Kacang dan konteks

Salah satu konsep utama dalam musim bunga ialah kacang . Pada dasarnya, ia hanyalah objek bagi sesetengah kelas. Katakan untuk program kami, kami perlu menggunakan 3 objek: kucing, anjing dan burung kakak tua. Dan kami mempunyai sekumpulan kelas dengan sekumpulan kaedah, di mana kadang-kadang kami memerlukan kucing untuk kaedah, dan anjing untuk kaedah lain, dan kadang-kadang kami akan mempunyai kaedah di mana kami memerlukan kucing dan burung nuri (contohnya, kaedah untuk memberi makan kucing, hehe), dan dalam beberapa kaedah, ketiga-tiga objek akan diperlukan. Ya, kita boleh mula-mula mencipta tiga objek ini dalam utama, dan kemudian menghantarnya ke kelas kita, dan dari dalam kelas kepada kaedah yang kita perlukan... Dan seterusnya sepanjang program. Dan jika kami juga membayangkan bahawa secara berkala kami ingin menukar senarai parameter yang diterima untuk kaedah kami (baik, kami memutuskan untuk menulis semula sesuatu atau menambah fungsi) - maka kami perlu membuat banyak pengeditan pada kod jika kami perlu tukar sesuatu. Sekarang, bagaimana jika kita membayangkan bahawa kita tidak mempunyai 3, tetapi 300 objek sedemikian? Alternatifnya ialah mengumpul semua objek kami ke dalam satu senarai objek biasa ( List<Object> ) dan menyampaikannya kepada semua kaedah, dan dari dalam kaedah dapatkan objek ini atau itu yang kami perlukan. Tetapi bagaimana jika kita membayangkan bahawa semasa program berjalan, beberapa objek boleh ditambahkan pada senarai ini, atau (apa yang lebih teruk) dipadamkan? Kemudian dalam semua kaedah di mana kita mendapatkan semula objek dari senarai dengan indeks mereka, semuanya boleh pecah. Kemudian kami memutuskan untuk menyimpan bukan senarai, tetapi peta, di mana kunci akan menjadi nama objek yang kami perlukan, dan nilainya akan menjadi objek itu sendiri, dan kemudian kami boleh mendapatkan objek yang kami perlukan daripadanya hanya dengan nama mereka : get("parrot") dan sebagai tindak balas kami menerima parrot objek Atau, sebagai contoh, kuncinya ialah kelas objek, dan nilainya ialah objek itu sendiri, maka kita tidak lagi boleh menunjukkan nama objek, tetapi hanya kelas objek yang kita perlukan, yang juga mudah. Atau tulis beberapa jenis pembungkus di atas peta, di mana anda boleh mencipta kaedah supaya dalam beberapa kes anda boleh mendapatkan semula objek dengan nama mereka, dan dalam kes lain mengikut kelas. Inilah yang kita dapat daripada konteks aplikasi musim bunga . Konteks ialah satu set kacang (objek). Beralih kepada konteks, kita boleh mendapatkan kacang (objek) yang kita perlukan dengan namanya, sebagai contoh, atau mengikut jenisnya, atau sesuatu yang lain. Di samping itu, kami boleh meminta Spring untuk mencari kacang yang kami perlukan dalam konteksnya dan menyampaikannya kepada kaedah kami. Sebagai contoh, jika kita mempunyai kaedah seperti ini:
public void doSomething(Cat cat) {
    ...
}
Apabila Spring memanggil kaedah ini untuk kami, ia menghantar objek kucing kami dari konteksnya ke dalamnya. Sekarang kami memutuskan bahawa kaedah kami, sebagai tambahan kepada kucing, juga memerlukan burung nuri. Menggunakan musim bunga - tiada yang lebih mudah untuk kami! Kami hanya menulis:
public void doSomething(Cat cat, Parrot parrot) {
    ...
}
dan Spring, apabila ia memanggil kaedah kita ini, akan memahami bahawa kita perlu menghantar kucing dan burung kakak tua di sini, pergi ke konteksnya, dapatkan dua objek ini dan hantarkannya ke kaedah kita. Dengan menyerahkan tampuk program kami kepada Spring, kami juga memindahkan kepadanya tanggungjawab untuk mencipta objek dan menyerahkannya kepada kaedah kami, yang akan dia panggil. Persoalannya timbul: bagaimana Spring akan mengetahui objek (tong sampah) yang hendak dibuat?

Kaedah Konfigurasi Aplikasi

Terdapat tiga cara utama untuk mengkonfigurasi aplikasi (iaitu, beritahu Spring objek mana yang perlu kami kerjakan):
  1. menggunakan fail / konfigurasi xml;
  2. menggunakan konfigurasi java;
  3. konfigurasi automatik.
Pembangun musim bunga menyusunnya mengikut urutan keutamaan ini:
  • kaedah paling keutamaan yang harus diberi keutamaan ialah konfigurasi automatik;
  • jika menggunakan konfigurasi automatik tidak mungkin untuk mengkonfigurasi semua kacang yang mungkin dengan betul, gunakan konfigurasi Java (membuat objek menggunakan kod Java);
  • Nah, cara keutamaan paling rendah ialah cara lama, menggunakan konfigurasi xml.
Di samping itu, Spring membolehkan anda menggabungkan kaedah ini. Sebagai contoh, biarkan Spring melakukan semua yang boleh dikonfigurasikan secara automatik; di mana anda perlu menentukan beberapa parameter khas, lakukannya menggunakan konfigurasi Java, dan sebagai tambahan, anda boleh menyambungkan beberapa konfigurasi warisan dalam format xml. Secara umum, semua ini boleh dilakukan dengan agak fleksibel. Tetapi masih, jika semuanya boleh dilakukan menggunakan tetapan automatik, gunakannya. Saya hanya akan mempertimbangkan konfigurasi automatik dan konfigurasi Java; konfigurasi xml sudah digunakan dalam hampir setiap contoh Spring di Internet, dan sebaik sahaja anda memahami cara konfigurasi Java berfungsi, seharusnya tiada masalah "membaca" fail xml yang melakukan perkara yang sama. Konfigurasi automatik digunakan apabila objek yang kita perlukan untuk kerja ialah objek kelas yang telah kita tulis . Jika beberapa logik yang sangat khusus diperlukan untuk mencipta objek kelas kami, atau jika kami tidak mempunyai peluang untuk menandakan kelas dengan anotasi yang kami perlukan, yang akan diambil oleh konfigurasi automatik, ini boleh dilakukan dalam konfigurasi Java . Di bahagian seterusnya kami akan membuat projek maven, sambungkan beberapa modul spring tengah kepadanya dan buat kacang pertama kami.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION