CodeGym /Blog Java /rawak /Spring untuk orang malas Asas, konsep asas dan contoh den...
John Squirrels
Tahap
San Francisco

Spring untuk orang malas Asas, konsep asas dan contoh dengan kod. Bahagian 1

Diterbitkan dalam kumpulan
Spring untuk orang malas Asas, konsep asas dan contoh dengan kod.  Bahagian 1 - 1Dalam artikel ini, saya tidak akan memberitahu anda bagaimana untuk mendapatkan projek Spring yang berfungsi dan berjalan dalam masa 5 minit menggunakan kod saya. Saya hanya akan menulis asas - perkara yang anda mungkin tidak tahu dan masih mencipta projek. Tetapi dalam artikel ini, anda masih tidak akan memahami apa yang berlaku dan, yang lebih penting, mengapa.

Apakah Rangka Kerja Musim Bunga?

Rangka Kerja Spring, atau ringkasnya Spring, ialah salah satu rangka kerja yang paling popular untuk mencipta aplikasi web dalam Java. Rangka kerja adalah seperti perpustakaan (mungkin anda lebih biasa dengan istilah ini), tetapi ada sesuatu yang perlu dipertimbangkan. Secara kasarnya, apabila anda menggunakan perpustakaan, anda hanya mencipta contoh kelas yang terkandung di dalamnya, memanggil kaedah yang anda perlukan, dan dengan itu mendapatkan hasil yang anda perlukan. Dalam erti kata lain, ini adalah pendekatan yang lebih penting: dalam program anda, anda secara jelas menunjukkan detik tertentu apabila anda perlu mencipta objek mana, bila hendak memanggil kaedah tertentu, dsb. Dengan rangka kerja, perkara adalah sedikit berbeza. Anda hanya menulis beberapa kelas anda sendiri dan menulis beberapa logik di dalamnya, tetapi kemudian rangka kerja itu sendiri mencipta contoh kelas anda dan memanggil kaedah mereka. Kelas anda biasanya melaksanakan beberapa antara muka daripada rangka kerja atau mewarisi beberapa kelasnya, dengan itu memberikan anda beberapa fungsi yang telah ditulis untuk anda. Tetapi ini tidak selalu berlaku. Sebagai contoh, Spring cuba sedaya mungkin untuk mengelakkan gandingan yang begitu ketat (di mana kelas anda bergantung secara langsung pada kelas/antara muka dalam rangka kerja). Ia menggunakan anotasi untuk mencapai ini. Kami akan kembali kepada perkara ini kemudian. Tetapi penting untuk memahami bahawa Spring hanyalah koleksi kelas dan antara muka yang tersedia untuk anda gunakan :) Saya juga ingin ambil perhatian segera bahawa Spring boleh digunakan bukan sahaja untuk aplikasi web, tetapi juga untuk program konsol yang paling biasa. yang begitu biasa kita semua. Dan kami juga akan menulis salah satu daripadanya hari ini. sekali gus memberikan anda beberapa fungsi yang telah ditulis untuk anda. Tetapi ini tidak selalu berlaku. Sebagai contoh, Spring cuba sedaya mungkin untuk mengelakkan gandingan yang begitu ketat (di mana kelas anda bergantung secara langsung pada kelas/antara muka dalam rangka kerja). Ia menggunakan anotasi untuk mencapai ini. Kami akan kembali kepada perkara ini kemudian. Tetapi penting untuk memahami bahawa Spring hanyalah koleksi kelas dan antara muka yang tersedia untuk anda gunakan :) Saya juga ingin ambil perhatian segera bahawa Spring boleh digunakan bukan sahaja untuk aplikasi web, tetapi juga untuk program konsol yang paling biasa. yang begitu biasa kita semua. Dan kami juga akan menulis salah satu daripadanya hari ini. sekali gus memberikan anda beberapa fungsi yang telah ditulis untuk anda. Tetapi ini tidak selalu berlaku. Sebagai contoh, Spring cuba sedaya mungkin untuk mengelakkan gandingan yang begitu ketat (di mana kelas anda bergantung secara langsung pada kelas/antara muka dalam rangka kerja). Ia menggunakan anotasi untuk mencapai ini. Kami akan kembali kepada perkara ini kemudian. Tetapi penting untuk memahami bahawa Spring hanyalah koleksi kelas dan antara muka yang tersedia untuk anda gunakan :) Saya juga ingin ambil perhatian segera bahawa Spring boleh digunakan bukan sahaja untuk aplikasi web, tetapi juga untuk program konsol yang paling biasa. yang begitu biasa kita semua. Dan kami juga akan menulis salah satu daripadanya hari ini. Spring cuba sedaya mungkin untuk mengelakkan gandingan yang begitu ketat (di mana kelas anda bergantung secara langsung pada kelas/antara muka dalam rangka kerja). Ia menggunakan anotasi untuk mencapai ini. Kami akan kembali kepada perkara ini kemudian. Tetapi penting untuk memahami bahawa Spring hanyalah koleksi kelas dan antara muka yang tersedia untuk anda gunakan :) Saya juga ingin ambil perhatian segera bahawa Spring boleh digunakan bukan sahaja untuk aplikasi web, tetapi juga untuk program konsol yang paling biasa. yang begitu biasa kita semua. Dan kami juga akan menulis salah satu daripadanya hari ini. Spring cuba sedaya mungkin untuk mengelakkan gandingan yang begitu ketat (di mana kelas anda bergantung secara langsung pada kelas/antara muka dalam rangka kerja). Ia menggunakan anotasi untuk mencapai ini. Kami akan kembali kepada perkara ini kemudian. Tetapi penting untuk memahami bahawa Spring hanyalah koleksi kelas dan antara muka yang tersedia untuk anda gunakan :) Saya juga ingin ambil perhatian segera bahawa Spring boleh digunakan bukan sahaja untuk aplikasi web, tetapi juga untuk program konsol yang paling biasa. yang begitu biasa kita semua. Dan kami juga akan menulis salah satu daripadanya hari ini. ) Saya juga ingin ambil perhatian segera bahawa Spring boleh digunakan bukan sahaja untuk aplikasi web, tetapi juga untuk program konsol yang paling biasa yang begitu biasa kepada kita semua. Dan kami juga akan menulis salah satu daripadanya hari ini. ) Saya juga ingin ambil perhatian segera bahawa Spring boleh digunakan bukan sahaja untuk aplikasi web, tetapi juga untuk program konsol yang paling biasa yang begitu biasa kepada kita semua. Dan kami juga akan menulis salah satu daripadanya hari ini.

Struktur

Tetapi Spring bukan hanya satu rangka kerja tertentu. Sebaliknya, ia adalah nama biasa yang digunakan untuk merujuk kepada beberapa rangka kerja kecil, yang setiap satunya melakukan jenis kerjanya sendiri. Spring untuk orang malas Asas, konsep asas dan contoh dengan kod.  Bahagian 1 - 2

https://docs.spring.io/spring/docs/4.3.26.RELEASE/spring-framework-reference/htmlsingle/
Rajah 2.1. Gambaran Keseluruhan Rangka Kerja Spring

Seperti yang anda lihat, Spring adalah modular. Ini membolehkan kami menyambung hanya modul yang kami perlukan untuk aplikasi kami dan tidak menyambung modul yang kami jelas tidak akan gunakan. Setahu saya, pendekatan inilah yang membolehkan Spring mengatasi pesaingnya ketika itu (EJB) dan mendahului. Aplikasi yang menggunakan EJB menyeret banyak kebergantungan di belakangnya, dan akibatnya, ia menjadi lembap dan perlahan. Imej menunjukkan bahawa Rangka Kerja Spring terdiri daripada beberapa modul:
  • Akses Data
  • Web
  • teras
  • dan banyak lagi
Hari ini kita akan berkenalan dengan beberapa konsep yang terdapat dalam modul utama: kacang, konteks dan lain-lain. Seperti yang mungkin anda duga, modul Akses Data mengandungi alat untuk bekerja dengan data (terutamanya pangkalan data), dan modul Web adalah untuk bekerja pada rangkaian (termasuk membuat aplikasi web, yang akan dibincangkan kemudian). Di samping itu, terdapat infrastruktur komprehensif yang menyokong Spring: banyak projek lain yang tidak disertakan secara rasmi dalam rangka kerja itu sendiri, tetapi disepadukan dengan lancar ke dalam projek Spring anda (contohnya, Spring Security, yang saya juga berharap untuk menyentuhnya, adalah untuk mengesahkan pengguna di tapak web).

Mengapa Java mempunyai Rangka Kerja Spring?

Nah, selain fakta bahawa ia bergaya, licin dan segar, saya boleh katakan sekarang bahawa sebaik sahaja anda mendapat sedikit kemahiran menggunakan Spring, anda akan memahami bagaimana terdapat semua jenis kerja yang anda tidak ada lagi. untuk dilakukan, dan berapa banyak kerja yang perlu diambil oleh Spring. Anda boleh menulis beberapa dozen baris tetapan konfigurasi dan menulis beberapa kelas, dan anda berakhir dengan projek yang berfungsi. Tetapi sebaik sahaja anda mula tertanya-tanya berapa banyak barangan di bawah hud, berapa banyak kerja yang sedang dilakukan, dan berapa banyak kod yang anda perlu tulis jika anda akan melaksanakan projek yang sama berdasarkan servlet atau soket biasa dan Java tulen, rambut anda akan berdiri tegak :) Musim bunga malah digambarkan sebagai sejenis sihir. Anda mengalami ini apabila anda melihat bahawa semuanya berfungsi, tetapi anda juga mempunyai idea kasar tentang bagaimana dan berapa banyak kerja yang berlaku di sebalik tabir — jadi nampaknya benar-benar ada sejenis sihir dalam tindakan :) Lebih mudah untuk memanggilnya sihir daripada cuba menerangkan bagaimana semuanya saling berkaitan. :) Hujah kedua yang memihak kepada mempelajari Spring ialah kira-kira 90% peluang pekerjaan untuk pembangun junior (berdasarkan pemerhatian peribadi saya) memerlukan sama ada pengetahuan atau sekurang-kurangnya idea umum tentang apa yang Spring'sData, Web MVC, dan Securitymodul menawarkan pembangun yang canggih :) Tetapi hari ini hanyalah mengenai perkara asas.

DI/IoC

Jika anda pernah cuba membaca tentang Spring, maka perkara pertama yang anda temui mungkin ialah akronim ini: DI/IoC. Sekarang saya sangat mengesyorkan agar anda berehat dari artikel ini dan membaca artikel DZone ini ! IoC bermaksud penyongsangan kawalan. Saya telah menyebut ini secara sepintas lalu apabila saya menulis bahawa menggunakan perpustakaan melibatkan anda sendiri yang menunjukkan dalam kod anda kaedah mana untuk memanggil objek mana, tetapi menggunakan rangka kerja secara amnya bermakna rangka kerja akan memanggil kod anda pada masa yang tepat. Dalam erti kata lain, dalam kes terakhir ini, anda tidak lagi menguruskan proses melaksanakan kod/program — rangka kerja melakukan ini untuk anda. Anda memberikan kawalan kepada rangka kerja (penyongsangan kawalan). DI bermaksud suntikan kebergantungan. Dengan suntikan pergantungan, anda tidak mencipta objek kucing dalam kaedah utama dan kemudian menyerahkannya kepada kaedah anda. Sebaliknya, Rangka Kerja Spring menciptanya untuk anda. Anda hanya sebut sesuatu seperti "Saya mahu mendapatkan kucing di sini" dan rangka kerja memberikan satu kepada anda dalam kaedah anda. Kita akan melihat singkatan ini dalam artikel akan datang.

Kacang dan konteks

Salah satu konsep utama dalam Spring ialah kacang. Sebenarnya, ini hanyalah objek bagi sesetengah kelas. Katakan kita mempunyai program yang memerlukan 3 objek: kucing, anjing dan burung kakak tua. Dan kami mempunyai sekumpulan kelas dengan sekumpulan kaedah. Kadang-kadang kita memerlukan kucing untuk kaedah, kadang-kadang kita memerlukan anjing untuk kaedah yang berbeza, dan kadang-kadang kaedah kita memerlukan kedua-dua kucing dan burung kakak tua (contohnya, kaedah untuk memberi makan kucing, ha-ha). Untuk kaedah lain, ketiga-tiga objek diperlukan. Ya, kita boleh mula-mula mencipta tiga objek ini dalam kaedah utama, dan kemudian menghantarnya ke kelas kita, dan kemudian dalam kelas ini menghantarnya ke kaedah yang berkaitan... Dan seterusnya sepanjang keseluruhan program. Tetapi jika kita juga menganggap bahawa kita kadang-kadang ingin menukar senarai parameter input untuk kaedah kita (contohnya, kami memutuskan untuk menulis semula sesuatu atau menambah fungsi baharu), maka kami perlu membuat sedikit perubahan pada kod tersebut. Dan sekarang bayangkan bahawa kita tidak mempunyai 3, tetapi 300 objek sedemikian. Satu alternatif ialah mengumpulkan semua objek kami dalam satu senarai (List<Object>), hantar ke setiap kaedah, dan kemudian dapatkan objek yang diperlukan semasa berada di dalam kaedah. Tetapi semasa program berjalan, bagaimana jika beberapa objek ditambahkan ke senarai ini, atau lebih teruk, bagaimana jika satu dipadamkan? Ini berpotensi untuk memecahkan setiap kaedah di mana kita menggunakan indeks untuk mendapatkan objek daripada senarai. Untuk mengelakkan masalah ini, kami memutuskan untuk menyimpan objek kami bukan dalam senarai, tetapi dalam peta, di mana kuncinya ialah nama objek dan nilainya ialah objek itu sendiri. Ini membolehkan kami mendapatkan semula objek yang kami perlukan hanya dengan menggunakan nama mereka, cth get("parrot"), dan sebagai tindak balas kami mendapat objek parrot. Atau kuncinya boleh menjadi kelas objek, dan nilainya boleh menjadi objek itu sendiri. Dalam kes ini, bukannya menentukan nama objek, tetapi hanya boleh menentukan kelas objek yang kita perlukan. Itu juga mudah. Atau kita juga boleh menulis beberapa jenis pembungkus untuk peta, di mana beberapa kaedah mendapatkan objek dengan nama mereka, dan kaedah lain mendapatkan objek mengikut kelas mereka. Apa yang kita telah sampai di sini dipanggil akonteks aplikasi dalam Rangka Kerja Spring. Konteks ialah koleksi kacang (objek). Kami mengakses konteks untuk mendapatkan kacang (objek) yang kami perlukan dengan namanya, dengan jenisnya, atau dengan beberapa cara lain. Selain itu, kami boleh meminta Spring sendiri untuk melihat dalam konteksnya sendiri untuk kacang yang kami perlukan dan menyampaikannya kepada kaedah kami. Sebagai contoh, katakan kita mempunyai kaedah seperti ini:

public void doSomething(Cat cat) {
    ...
}
Apabila Spring memanggil kaedah ini, ia mengambil objek kucing kami dari konteksnya dan menyampaikannya kepada kaedah. Tetapi sekarang kami telah memutuskan bahawa, sebagai tambahan kepada kucing, kaedah kami juga memerlukan burung nuri. Dengan Spring, tiada apa yang lebih mudah! Kami hanya menulis:

public void doSomething(Cat cat, Parrot parrot) {
    ...
}
Sekarang apabila Spring memanggil kaedah kami, ia memahami keperluan untuk menghantar kucing dan burung kakak tua, jadi ia pergi ke konteksnya, dapatkan kedua-dua objek ini dan hantarkannya ke kaedah kami. Dengan memindahkan tampuk kawalan kepada Spring, kami juga memindahkan tanggungjawab untuk mencipta objek dan menyerahkannya kepada kaedah kami, yang akan dipanggil Spring. Ini menimbulkan persoalan: bagaimana Spring mengetahui objek (kacang) yang hendak dibuat?

Cara untuk mengkonfigurasi aplikasi

Terdapat tiga cara utama untuk mengkonfigurasi aplikasi , iaitu cara untuk memberitahu Spring dengan tepat objek yang kita perlukan:
  1. Fail konfigurasi XML
  2. Konfigurasi berasaskan Java
  3. konfigurasi automatik
Pencipta Spring mengutamakan mereka dalam susunan ini:
  • kaedah dengan keutamaan utama, yang harus diutamakan, adalah konfigurasi automatik
  • jika konfigurasi automatik tidak boleh digunakan untuk mengkonfigurasi semua kacang yang mungkin dengan betul, gunakan konfigurasi berasaskan Java (yang melibatkan penciptaan objek menggunakan kod Java)
  • dan kaedah keutamaan terendah ialah cara lama — menggunakan fail konfigurasi XML.
Spring juga membolehkan kami menggabungkan kaedah ini. Contohnya, biarkan Spring mengkonfigurasi semua yang boleh dikonfigurasikan secara automatik, gunakan konfigurasi berasaskan Java di mana sahaja anda memerlukan parameter khas dan gunakan XML untuk sebarang konfigurasi warisan. Ini semua berfungsi agak fleksibel. Namun, jika semuanya boleh dikonfigurasikan secara automatik, pilih pilihan itu. Saya hanya akan mempertimbangkan konfigurasi automatik dan konfigurasi berasaskan Java. Konfigurasi XML digunakan dalam hampir setiap contoh Spring di Internet. Lebih-lebih lagi, sebaik sahaja anda memahami cara konfigurasi berasaskan Java berfungsi, anda sepatutnya tidak menghadapi masalah membaca fail XML yang melakukan perkara yang sama. Konfigurasi automatik digunakan apabila kita perlu bekerja dengan objek kelas yang kita tulis. Jika mencipta salah satu objek kami memerlukan logik yang sangat khusus, atau jika kami tidak dapat membuat beberapa kelas dengan anotasi yang diperlukan untuk konfigurasi automatik, maka kami boleh menggunakan konfigurasi berasaskan Java untuk melakukan apa yang perlu dilakukan. Di dalambahagian seterusnya , kami akan mencipta projek Maven, menyambung beberapa modul Spring utama, dan mencipta kacang pertama kami.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION