MENGAPA
Pada awal kelahirannya, tujuan utama menciptakan musim semi adalah untuk menggantikan teknologi Java tingkat perusahaan yang lebih berat, terutama EJB. Dibandingkan dengan EJB, Spring memberikan model pemrograman yang lebih ringan dan lebih sederhana.
APA
Spring adalah kerangka kerja open source yang pertama kali dibuat oleh Rodjohnson. Spring diciptakan untuk menyelesaikan kompleksitas pengembangan aplikasi tingkat perusahaan. Menggunakan Spring dapat memungkinkan JavaBeans sederhana untuk mengimplementasikan hal -hal yang hanya dapat dicapai EJB sebelumnya. Musim semi tidak terbatas pada pengembangan sisi server, aplikasi Java apa pun dapat memperoleh manfaat dari musim semi dalam hal kesederhanaan, kemampuan testabilitas, dan kopling longgar.
Hari ini musim semi terlibat dalam pengembangan seluler, integrasi API sosial, database NoSQL, komputasi awan dan data besar. Seiring waktu, EJB juga mengadopsi konsep injeksi ketergantungan (DI) dan pemrograman berorientasi aspek (AOP). Singkatnya, misi paling mendasar di musim semi adalah menyederhanakan pengembangan java
BAGAIMANA
Untuk mengurangi kompleksitas pengembangan Java, musim semi mengadopsi strategi utama 4 menit
Pemrograman invasif ringan dan minimal berdasarkan POJO memungkinkan kopling longgar melalui injeksi ketergantungan dan berorientasi antarmuka
Pemrograman deklaratif berdasarkan bagian dan konvensi mengurangi kode gaya melalui bagian dan templat
Potensi pojo
Banyak kerangka kerja memaksa aplikasi untuk mewarisi kelas mereka atau mengimplementasikan antarmuka mereka, yang mengarah pada aplikasi yang terikat pada kerangka kerja, yang merupakan pemrograman invasif, yang mengakibatkan ketidakmampuan untuk menggunakan kembali blok kode. Spring berusaha untuk menghindari mengacaukan kode aplikasi Anda karena API sendiri. Dalam aplikasi yang dibangun pada musim semi, kelas -kelasnya biasanya tidak memiliki jejak tanda -tanda yang Anda gunakan musim semi.
kelas publik helloWorldbean {public string sayshello () {return "hello world"; }} Kode contoh di atas mewakili kelas Java (POJO) yang sangat sederhana dan biasa. Anda tidak dapat mengatakan bahwa ini adalah komponen pegas. Pemrograman non-invasif Spring tercermin dalam kelas ini yang dapat berperan dalam aplikasi musim semi dan aplikasi non-musim semi. Hanya sepotong kode ini tidak benar -benar mencerminkan fungsi Spring, dan pengetahuan berikut masih diperlukan.
Injeksi ketergantungan (menyuntikkan kelas itu sendiri bergantung pada)
Injeksi ketergantungan tidak terlalu tinggi di musim semi, meskipun telah berkembang menjadi teknik pemrograman yang kompleks atau konsep pola desain. Ini dipahami di musim semi, menyuntikkan dependensi. Aplikasi dengan signifikansi praktis membutuhkan banyak kelas untuk berkolaborasi satu sama lain untuk menyelesaikan logika bisnis tertentu. Praktik tradisional adalah bahwa setiap objek bertanggung jawab untuk mengelola referensi ke objek yang terkait dengan dirinya sendiri (objek terkait ini adalah objek yang bergantung pada objek yang diekspresikan dalam musim semi), tetapi ini akan membuat sulit untuk menguji kode yang sangat tinggi dan kode.
Pertimbangkan kode berikut
/** Nama kelas yang sulit untuk bermajur ini secara khusus dinamai oleh penulis agar sesuai dengan adegan yang disimulasikan* Kelas ini mewakili Knight yang menyelamatkan gadis itu* yang dibuat oleh Wung pada 2016/8/25. */public class DamselRescuingKnight implements Knight{private RescueDamselQuest quest;/** * Created RescueDamselQuest in its constructor * This makes DamselRescuingKnight and RescuingDamselQuest in its constructor coupled together*/public DamselRescuingKnight(){this.quest = new RescueDamselQuest();}public void embarkonquest () {quest.embark ();}} Kopling memiliki dua sisi. Di satu sisi, kode yang digabungkan dengan ketat sulit untuk diuji, digunakan kembali, dan dipahami, dan akan ada bug tipe "melawan goblin". Di sisi lain, tingkat kopling tertentu diperlukan, dan kelas yang berbeda harus berinteraksi dengan cara yang tepat.
Masalahnya muncul, jadi bagaimana Spring menyelesaikannya?
Di musim semi, melalui injeksi ketergantungan (DI), ketergantungan antara objek ditetapkan oleh komponen pihak ketiga dalam sistem yang mengoordinasikan setiap objek saat membuat objek. Dengan kata lain, objek hanya perlu mengelola properti internal mereka tanpa membuat atau mengelola ketergantungan mereka sendiri, dan dependensi akan secara otomatis disuntikkan ke dalam objek yang membutuhkannya.
/*** Ksatria ini dapat melakukan berbagai tugas petualangan, bukan hanya yang sebelumnya untuk menyelamatkan gadis itu* yang dibuat oleh Wung pada 2016/8/25. */public class BraveKnight implements Knight{private Quest quest;/** * BraveKnight does not create adventure types on its own, but passes adventure tasks as parameters during construction* This is one of the ways of dependency injection: constructor injection*/public BraveKnight(Quest quest){this.quest = quest;}public void embarkOnQuest(){quest.embark();}} Braveknight tidak digabungkan dengan implementasi pencarian tertentu. Selama tugas mengimplementasikan antarmuka Quest, tidak masalah jenis petualangan itu. Ini mencapai tujuan di - kopling longgar
Jika suatu objek hanya menunjukkan ketergantungan melalui antarmuka, maka ketergantungan ini dapat diganti dengan implementasi konkret yang berbeda tanpa objek itu sendiri yang disadari.
Jadi sekarang, mari kita menyuntikkan makna praktis
Untuk kode di atas, kami akan menyuntikkan tugas petualangan dengan implementasi khusus ke dalam ksatria pemberani
/** Misi petualangan dari Slaying Dragons (penulis ini adalah kelas dua yang baik)*Dibuat oleh Wung pada 2016/8/25. */Public Class SlayDragonQuest mengimplementasikan Quest {private printStream Stream; public slaydragonquest (printStream stream) {this.stream = stream;} public void embark () {stream.print ("bunuh naga");}}Jadi sekarang pertanyaannya adalah, bagaimana menyuntikkan objek printstream itu tergantung pada di SlayDragonquest, bagaimana menyuntikkan objek pencarian yang tergantung pada Braveknight. Musim semi yang disebutkan di atas akan mengelola ketergantungan ini secara terpusat, dan perilaku menciptakan kolaborasi antara komponen aplikasi biasanya disebut perakitan (kabel), yaitu injeksi. Spring menyediakan berbagai metode perakitan untuk diperkenalkan secara lebih rinci nanti. Di sini kami secara singkat memperkenalkan perakitan berdasarkan XML dan perakitan berdasarkan anotasi Java.
<!- Ini adalah proses perakitan. Deklarasikan Slaydragonquest sebagai kacang, bernama "Quest". Karena ini adalah injeksi konstruktor, gunakan nilai atribut konstruktor-arg untuk mewakili nilai yang disuntikkan. Proses ini memecahkan masalah sebelumnya. Suntikkan objek PrintStream ke objek SlayDragonQuest-> <bean id = "quest"> <konstruktor-arg value = "#{t (sistem) .out}"> </constructor-Arg> </ bean> <!-proses ini sama seperti di atas. Braveknight menyatakan kacang bernama "Knight" (nama ini tidak harus digunakan) maka parameter konstruktor Braveknight harus menjadi tipe pencarian. Pada saat ini, kacang lain dilewatkan dalam referensi, yang merupakan referensi kacang dengan nama "pencarian" di atas. Pada saat ini, injeksi konstruktor dari Braveknight juga selesai-> <bean id = "knight"> <konstruktor-arg ref = "quest"> </constructor-arg> </t bean>Spring menyediakan konfigurasi berbasis java yang dapat digunakan sebagai alternatif untuk XML
/** File konfigurasi berbasis Java mengimplementasikan perakitan objek*dibuat oleh Wung pada 2016/8/26. */ @Configurationpublic kelas knightconfig {@bean public knight () {return new Braveknight (quest ()); } @Bean Public Quest Quest () {return new SlayDragonQuest (System.out); }}Efeknya sama, dan penjelasan spesifik dijelaskan secara rinci dalam bab berikutnya. Mari kita tinjau lagi. Telah dikatakan bahwa musim semi akan secara otomatis mengelola dependensi antar objek, jadi apa jenis manajer ini? Jawabannya adalah konteks aplikasi, yang merupakan wadah untuk pegas yang dapat memuat definisi kacang dan mengumpulkannya. Konteks aplikasi pegas semata -mata bertanggung jawab atas pembuatan dan perakitan objek. Bahkan, ada banyak cara untuk mengimplementasikan perbedaan antara konteks ini, hanya perbedaan dalam konfigurasi pemuatan. Mari kita lihat cara memuat konfigurasi.
Public Class KnightMain {public static void main (string [] args) {annotationConfigApplicationContext context = new AnnotationConfigApplicationContext (knightconfig.class); // Definisi kacang dapat diperoleh dari file konfigurasi. Knight Knight = Context.getBean (Knight.class); Knight.embarkonquest (); context.close (); }}Oleskan pemotongan wajah
DI dapat menjaga komponen perangkat lunak kolaboratif digabungkan secara longgar, sementara pemrograman facet memungkinkan Anda untuk memisahkan fungsi di seluruh aplikasi untuk membentuk komponen yang dapat digunakan kembali, dan, lebih khusus, itu adalah teknologi yang mendorong sistem perangkat lunak untuk berusaha untuk fokus. Apa itu fokus? Layanan sistem seperti pencatatan, manajemen transaksi, dan manajemen keamanan sering kali perlu diintegrasikan ke dalam komponen lain yang memiliki logika bisnis sendiri. Layanan sistem ini biasanya disebut fokus lintas-pemotongan karena akan digunakan kembali di banyak tempat, mencakup banyak komponen sistem. Sederhananya, Anda mengekstrak layanan yang perlu digunakan kembali dari berbagai komponen lain, tetapi bagaimana menggunakannya? Bahkan, itu adalah untuk memasukkan metode ke tempat yang perlu Anda gunakan saat menggunakannya. Namun, menurut istilah "bagian" ini harus dinyatakan sebagai mengekstraksi komponen yang digunakan kembali sebagai bagian, dan memotong bagian melalui komponen saat diperlukan. Jadi dengan cara ini, aplikasi inti tidak perlu mengetahui keberadaan bagian ini, dan bagian tidak akan mengintegrasikan logika bisnis ke dalam aplikasi inti.
/** Kelas penyanyi digunakan untuk memuji para ksatria, yaitu, untuk melayani Knights*yang dibuat oleh Wung pada 2016/8/26. */kelas publik Minstrel {private printStream Stream; Public Minstrel (PrintStream Stream) {this.stream = stream; } // Jalankan public void singbeforequest () {stream.print ("begin"); } // Jalankan public void singafterquest () {stream.print ("end"); }} Kelas Publik Braveknight mengimplementasikan Knight {Private Quest Quest; Private Minstrel Minstrel;/*** Braveknight tidak menciptakan tipe petualangan sendiri, tetapi melewati tugas petualangan sebagai parameter dalam konstruksi* Ini adalah salah satu cara injeksi ketergantungan: tuan -tuan/tuan -tuan (pencarian publik/quest (quest quest (pencarian quest) {/ini. Minstrel) {this.quest = quest; this.minstrel = Minstrel;} public void embarkonquest () {Minstrel.singbeforeQuest (); quest.embark (); Minstrel.singafterquest ();}} Pada saat ini, ksatria pemberani mulai mengeksekusi, tetapi ia menemukan bahwa dalam tugasnya itu bukan hanya risiko, tetapi sekarang ia harus mengelola penyanyi untuk memuji dia, tetapi ini sendiri seharusnya bukan milik kategori yang harus dikelola. Oleh karena itu, menggunakan gagasan bagian, kita perlu mengekstraksi perilaku pujian penyanyi dan menjadi bagian. Sebelum Cavaliers mengambil risiko, bagian ini akan dipotong dan melaksanakan metode SingBeforeQuest dan melaksanakan metode SingafterQuest setelah risiko. Jadi ini akan mewujudkan kode yang tidak perlu dipuji oleh ksatria, dan penyanyi tidak ada di objek ksatria. Dia tidak hanya akan memuji ksatria, tetapi juga memuji siapa pun selama orang lain menggunakan bagian ini untuk masuk.
<!-berarti bahwa mengkonfigurasi kacang dengan id di atas sebagai penyanyi sebagai bagian sebenarnya mengkonfigurasi penyanyi sebagai bagian-> aspek ref = "minstrel"> <!-mendefinisikan titik masuk, yaitu, di mana menggunakan ekspresi bagian = "yang ada di sini. dan eksekusi pasca-not sebelum dan sesudah titik entri-potong-> </aop: After> </aop: sebelum> </aop: pointcut> </aop: </aop: config>
Situasinya adalah bahwa Minstrel masih merupakan pojo independen, dan konteks musim semi telah mengubahnya menjadi bagian. Yang paling penting adalah bahwa ksatria tidak tahu keberadaan bagian ini saat ini. Ini hanya berangan kecil, yang sebenarnya dapat melakukan banyak hal penting.
Gunakan templat untuk menghilangkan kode gaya
Ada situasi di mana ketika kami menggunakan JDBC untuk mengakses database untuk meminta data, proses lengkap memerlukan pembentukan koneksi, membuat objek pernyataan, memproses set hasil, menanyakan, dan menutup berbagai koneksi. Selain itu, berbagai pengecualian ditangkap, dan kemudian kueri dalam berbagai skenario membutuhkan pengulangan yang melelahkan. JDBC bukan hanya satu -satunya kasus di mana ada banyak kode gaya seperti ini. Spring bertujuan untuk menghilangkan kode gaya melalui enkapsulasi template, seperti JDBCtemplate Spring.
Mengakomodasi kacang Anda
Dalam aplikasi berbasis musim semi, objek aplikasi Anda hidup dalam wadah musim semi, yang bertanggung jawab untuk membuat objek yang dirakit objek dan mengelola siklus hidup mereka. Jadi apa itu Container Musim Semi? Tidak hanya ada satu jenis wadah. Spring hadir dengan beberapa implementasi kontainer. Ini dibagi menjadi dua kategori: pabrik kacang, yang merupakan wadah paling sederhana untuk memberikan dukungan di dasar. Konteks aplikasi relatif canggih dan menyediakan layanan tingkat kerangka kerja aplikasi. Sebagian besar waktu, konteks aplikasi lebih populer.
Konteks aplikasi juga dibagi menjadi berbagai cara memuat konfigurasi.
Berbagai fitur musim semi
Meringkaskan
Spring adalah teknologi kerangka kerja yang dapat menyederhanakan pengembangan, dan konten intinya adalah DI dan AOP.
Di atas adalah gosip tentang artikel ini - secara bertahap memahami seluruh konten Spring, saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke situs ini:
SpringMVC Memulai Contoh
Penjelasan terperinci tentang kode untuk menyuntikkan nilai atribut menggunakan file konfigurasi dan @Value di Spring
Sampel kode rinci redis terintegrasi
Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya.