Bagaimana saya mempelajari kerangka kerja Spring (bantuan untuk pemula adalah karya pemula sendiri)

Selamat siang

Saya menetapkan tujuan belajar kerangka kerja Musim Semi untuk bahasa Jawa. Selama penelitian, saya memutuskan untuk memeriksa sendiri algoritma pembelajaran Richard Feynman: mengatur-menyederhanakan-melatih yang lain. Secara umum, saya mulai merekam serangkaian pelajaran singkat untuk pemula yang bekerja di Spring. Bagi mereka yang ingin mengulang, saya meletakkan kode sumber .

Pelajaran 01. Memahami IoC


Jadi, mari kita kumpulkan para penyair, biarkan mereka menulis dan membacakan puisi untuk kita.

Pertama, deklarasikan antarmuka yang menghasilkan ayat src \ main \ java \ spring \ interfaces \ Lyricist.java:

package spring.intarfaces; public interface Lyricist { public String Generate(); } 

Kami mengimplementasikan antarmuka ini di kelas src \ main \ java \ spring \ impls \ Mayakovsky.java :

 package spring.impls; import spring.intarfaces.Lyricist; public class Mayakovsky implements Lyricist { @Override public String Generate() { return " \r\n" + " \r\n" + " \r\n" + "   ?"; } } 

Kami akan menulis bahwa kami akan membuat objek Mayakovsky spesifik dalam file konfigurasi xml src \ main \ resources \ ApplicationContext.xml :

 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="LyricistBean1" class="spring.impls.Mayakovsky"/> </beans> 

Terkait id LyricistBean1 dengan nama kelas Mayakovsky. Hampir semuanya sudah siap, hanya kelas panggilan src \ main \ java \ spring \ main \ Start.java yang hilang :

 package spring.main; import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import spring.intarfaces.Lyricist; public class Start { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml"); Lyricist lyr1 = context.getBean("LyricistBean1", Lyricist.class); System.out.println(lyr1.Generate()); ((ConfigurableApplicationContext) context).close();//    } } 

Di kelas Start, kita membaca file konfigurasi kita, membuat instance dari penyair bernama bean LyricistBean1. Punya salinan penyair Mayakovsky. Fungsi Generate () mengembalikan kepada kita string abadi:
Dan kamu
bermain nocturne
bisa
pada seruling pipa pembuangan?

Pelajaran 02. Memilih sebuah instance untuk dibuat melalui file konfigurasi


Katakanlah seorang teman membantu kami dan menyediakan implementasi antarmuka Lyricist src \ main \ java \ spring \ impls \ Poushkin.java kami yang lain :

 package spring.impls; import spring.intarfaces.Lyricist; public class Poushkin implements Lyricist { @Override public String Generate() { return "   :\r\n" + "   ,\r\n" + "  ,\r\n" + "   ."; } } 

Dalam file konfigurasi ApplicationContext.xml, ubah Mayakovsky ke Poushkin.

Jalankan programnya. Kami mendapatkan hasil yang sama sekali berbeda tanpa membangun kembali :
Saya ingat saat yang indah
Anda muncul di hadapanku
Seperti visi singkat
Seperti seorang jenius kecantikan murni.

Pelajaran 03. Kacang dalam kode, bukan dalam file konfigurasi


Misalkan kita tidak ingin memberikan pilihan kelas penyair yang kita buat ke tangan takdir dalam file konfigurasi.

Ubah kelas Poushkin.java

  1. Tambahkan impor impor perpustakaan org.springframework.stereotype.Component;
  2. Letakkan anotasi Komponen ("LyricistBean1") sebelum deklarasi kelas

Jadi kami mengisyaratkan kepada Spring bahwa kami ingin melihat Poushkin dalam bentuk penyair pertama, dan bukan orang lain.

Tetap sedikit memperbaiki file konfigurasi ApplicationContext.xml:

1. Tambahkan konteks namespace: xmlns: context = " www.springframework.org/schema/context ";

2. Hapus baris yang tidak perlu: />

3. Tambahkan perintah alih-alih untuk secara otomatis menambahkan nampan dari semua kelas yang terletak di direktori spring.impls ke program:

<context: component-scan base-package = "spring.impls" />

Akibatnya, file ApplicationContext.xml akan terlihat seperti ini:

 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <context:component-scan base-package="spring.impls"/> </beans> 

Kita mulai. Kami mendapatkan hasil yang sama seperti pada pelajaran sebelumnya.

Pelajaran 04. Kelas Konfigurasi


Mari kita singkirkan file xml sekaligus.

Semua pengaturan juga bisa di kelas java. Terkadang itu nyaman.

Tambahkan kelas konfigurasi khusus src \ main \ java \ spring \ main \ LyricistConfiguration.java ke program kami:

 package spring.main; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @ComponentScan(basePackages = { "spring.impls" }) @Configuration public class LyricistConfiguration { } 

@ComponentScan menunjukkan direktori tempat untuk mencari kacang.
@Configuration melaporkan bahwa kelas kami adalah konfigurasi khusus.

Itu saja, file xml tidak lagi diperlukan. Tetap melaporkan berita ini ke kelas utama kami:

  1. Tambahan dengan impor impor yang diperlukan org.springframework.context.annotation.AnnotationConfigApplicationContext;
  2. Ganti baris pembuatan konteks
    ApplicationContext context = AnnotationConfigApplicationContext baru (LyricistConfiguration.class);

Akibatnya, file src \ main \ java \ spring \ main \ Start.java utama akan terlihat seperti ini:

 package spring.main; import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import spring.intarfaces.Lyricist; public class Start { public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(LyricistConfiguration.class); Lyricist lyr1 = context.getBean("LyricistBean1", Lyricist.class); System.out.println(lyr1.Generate()); ((ConfigurableApplicationContext) context).close();//    } } 

Semuanya dimulai dan masih menghasilkan garis Pushkin abadi. Semuanya berfungsi. Tapi sudah tanpa xml.

Pelajaran 05. Singleton dan Prototipe


Jelajahi kemampuan file konfigurasi. Karena itu, mari kita kembali ke proyek dari pelajaran kedua. Mari kita coba untuk membuat dua instance dari kelas Poushkin di Start.java dan pastikan bahwa penyair hebat itu sama:

  Lyricist lyr1 = context.getBean("LyricistBean1", Lyricist.class); System.out.println(lyr1.Generate()); System.out.println(lyr1.hashCode()); Lyricist lyr2 = context.getBean("LyricistBean1", Lyricist.class); System.out.println(lyr2.Generate()); System.out.println(lyr2.hashCode()); 

Dan ayat-ayatnya sama, dan kode hash turun. Semuanya baik-baik saja.

Tambahkan ke proyek kami warga sederhana yang tidak menulis ayat src \ main \ java \ spring \ impls \ SimpleMan.java :

 package spring.impls; import spring.intarfaces.Lyricist; public class SimpleMan implements Lyricist { @Override public String Generate() { return "  ,   "; } } 

Daftarkan kelas dalam file konfigurasi (segera setelah nampan pertama)
  <bean id="LyricistBean2" class="spring.impls.SimpleMan"/> 


Kami berusaha menciptakan

  Lyricist lyr1 = context.getBean("LyricistBean2", Lyricist.class); System.out.println(lyr1.Generate()); System.out.println(lyr1.hashCode()); Lyricist lyr2 = context.getBean("LyricistBean2", Lyricist.class); System.out.println(lyr2.Generate()); System.out.println(lyr2.hashCode()); 

Warga negara adalah sama sepanjang waktu. Kekacauan ...

Ubah registrasi kacang di file konfigurasi dengan menambahkan kata ajaib scope = "prototype"

Akibatnya, file src \ main \ resources \ ApplicationContext.xml akan terlihat seperti ini:

 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="LyricistBean1" class="spring.impls.Poushkin" scope="singleton"/> <bean id="LyricistBean2" class="spring.impls.SimpleMan" scope="prototype"/> </beans> 

Sekarang semuanya baik-baik saja. Warga berbeda setiap saat. Tapi Pushkin selalu sendirian.

Orang yang penuh perhatian memperhatikan bahwa pengaturan lingkup = "singleton" telah ditambahkan di nampan pertama, tetapi pengaturan ini digunakan secara default, jadi Anda tidak dapat menulisnya.

Itu saja untuk hari ini. Jika posting ini melewati moderasi, dan saya punya waktu dan energi, akan ada kelanjutan tentang AOP, JDBC, transaksi, MVC dan kebijakan lainnya.

Salam, Vladimir

Source: https://habr.com/ru/post/id420901/


All Articles