1. Pengenalan
Boleh dikatakan salah satu prinsip pembangunan yang paling penting dalam reka bentuk perisian moden adalah Dependency Injection (DI) yang secara semula jadi mengalir keluar dari prinsip lain yang sangat penting: Modularity.
Artikel ini akan meneroka jenis teknik DI tertentu yang disebut Konstruktor-Dependency Injection dalam Spring - yang secara sederhana, bermaksud bahawa komponen yang diperlukan dimasukkan ke dalam kelas pada masa instansiasi.
Untuk memulakan, kita perlu mengimport pergantungan konteks musim bunga di pom.xml kami :
org.springframework spring-context 5.2.8.RELEASE
Maka kita perlu menyediakan fail Konfigurasi . Fail ini boleh menjadi POJO atau jika anda suka, fail XML.
2. Konfigurasi Berasaskan Anotasi
Fail konfigurasi Java kelihatan seperti objek Java biasa dengan beberapa anotasi tambahan:
@Configuration @ComponentScan("com.baeldung.constructordi") public class Config { @Bean public Engine engine() { return new Engine("v8", 5); } @Bean public Transmission transmission() { return new Transmission("sliding"); } }
Di sini kami menggunakan anotasi untuk memberitahu waktu operasi Spring bahawa kelas ini adalah penyedia definisi kacang ( anotasi @Bean ) dan bahawa imbasan konteks untuk kacang tambahan perlu dilakukan dalam pakej com.baeldung.spring . Seterusnya, kami menentukan kelas Kereta :
@Component public class Car { @Autowired public Car(Engine engine, Transmission transmission) { this.engine = engine; this.transmission = transmission; } }
Spring akan mengikuti kelas Kereta kami semasa melakukan imbasan pakej dan akan memulakan permulaannya dengan memanggil pembina anotasi @Autowired .
Contoh Mesin dan Transmisi akan diperoleh dengan memanggil kaedah anotasi @Bean dari kelas Config . Akhirnya, kita perlu bootstrap ApplicationContext menggunakan konfigurasi POJO kami:
ApplicationContext context = new AnnotationConfigApplicationContext(Config.class); Car car = context.getBean(Car.class);
3. Suntikan Pembina Tersirat
Mulai Spring 4.3, kelas dengan satu pembina boleh menghilangkan anotasi @Autowired . Sedikit kemudahan dan penyingkiran plat boiler!
Selain itu, juga bermula dengan 4.3, suntikan berasaskan konstruktor dapat dimanfaatkan dalam kelas anotasi @Configuration . Dan ya, jika kelas seperti itu hanya mempunyai satu pembina, anotasi @Autowired juga boleh dihilangkan.
4. Konfigurasi Berasaskan XML
Cara lain untuk mengkonfigurasi runtime Spring dengan suntikan kebergantungan berasaskan konstruktor adalah dengan menggunakan fail konfigurasi XML:
Perhatikan bahawa konstruktor-arg dapat menerima nilai literal atau rujukan ke kacang lain dan indeks dan jenis eksplisit pilihan dapat diberikan. Jenis dan atribut indeks dapat digunakan untuk menyelesaikan kesamaran (contohnya jika konstruktor mengambil beberapa argumen dari jenis yang sama).
nama atribut juga dapat digunakan untuk pencocokan variabel xml ke java, tetapi kemudian kod anda mesti disusun dengan debug flag dihidupkan.
Konteks aplikasi Spring, dalam kes ini, perlu diikat dengan menggunakan ClassPathXmlApplicationContext :
ApplicationContext context = new ClassPathXmlApplicationContext("baeldung.xml"); Car car = context.getBean(Car.class);
5. Kebaikan dan Kekurangan
Suntikan konstruktor mempunyai beberapa kelebihan berbanding suntikan medan.
Manfaat pertama adalah kebolehujian. Katakan kita akan menguji unit kacang musim bunga yang menggunakan suntikan ladang:
public class UserService { @Autowired private UserRepository userRepository; }
Semasa pembinaan contoh UserService , kita tidak dapat memulakan keadaan userRepository . Satu-satunya cara untuk mencapainya adalah melalui Reflection API, yang sepenuhnya memecahkan enkapsulasi. Juga, kod yang dihasilkan akan kurang selamat berbanding dengan panggilan konstruktor sederhana.
Selain itu, dengan suntikan lapangan, kami tidak dapat menerapkan invarian peringkat kelas.Oleh itu, mungkin ada instance UserService tanpa userRepository yang diinisialisasi dengan betul . Oleh itu, kita mungkin mengalami NullPointerException rawak di sana sini. Dengan suntikan konstruktor, lebih mudah untuk membina komponen yang tidak berubah.
Lebih-lebih lagi, menggunakan konstruktor untuk membuat kejadian objek adalah lebih semula jadi dari sudut pandangan OOP.
Sebaliknya, kelemahan utama suntikan konstruktor adalah ketumpatannya terutama apabila kacang mempunyai sedikit kebergantungan. Kadang-kadang boleh menjadi rahmat dalam penyamaran, kerana kita mungkin berusaha lebih keras untuk memastikan bilangan pergantungan minimum.
6. Kesimpulannya
Tutorial ringkas ini telah menunjukkan asas-asas dari dua cara yang berbeza untuk menggunakan Suntikan Dependensi Berasaskan Konstruktor menggunakan rangka Spring.
The pelaksanaan penuh tutorial ini boleh didapati lebih pada GitHub.