Pengenalan Belati 2

1. Pengenalan

Dalam tutorial ini, kita akan melihat Dagger 2 - kerangka suntikan kebergantungan yang cepat dan ringan.

Rangka kerja ini tersedia untuk Java dan Android, tetapi prestasi tinggi yang dihasilkan dari suntikan waktu kompilasi menjadikannya penyelesaian utama untuk yang terakhir.

2. Suntikan Ketergantungan

Sebagai sedikit peringatan, Dependency Injection adalah aplikasi konkrit dari prinsip Inversion of Control yang lebih umum di mana aliran program dikendalikan oleh program itu sendiri.

Ia dilaksanakan melalui komponen luaran yang menyediakan contoh objek (atau ketergantungan) yang diperlukan oleh objek lain.

Dan kerangka kerja yang berbeza melaksanakan suntikan kebergantungan dengan cara yang berbeza. Khususnya, salah satu perbezaan yang paling ketara ialah sama ada suntikan berlaku pada waktu berjalan atau pada waktu kompilasi.

Run-time DI biasanya berdasarkan refleksi yang lebih mudah digunakan tetapi lebih perlahan pada waktu run. Contoh kerangka DI jangka masa adalah Spring.

Di masa kompilasi, sebaliknya, berdasarkan penjanaan kod. Ini bermaksud bahawa semua operasi berat dilakukan semasa penyusunan. DI masa kompilasi menambah kerumitan tetapi umumnya berkinerja lebih pantas.

Belati 2 termasuk dalam kategori ini.

3. Konfigurasi Maven / Gradle

Untuk menggunakan Dagger dalam projek, kita perlu menambahkan ketergantungan keris ke pom.xml kami :

 com.google.dagger dagger 2.16 

Selain itu, kami juga perlu memasukkan penyusun Dagger yang digunakan untuk menukar kelas beranotasi kami ke dalam kod yang digunakan untuk suntikan:

 org.apache.maven.plugins maven-compiler-plugin 3.6.1    com.google.dagger dagger-compiler 2.16    

Dengan konfigurasi ini, Maven akan mengeluarkan kod yang dihasilkan menjadi target / dihasilkan-sumber / anotasi .

Atas sebab ini, kami mungkin perlu mengkonfigurasi lebih lanjut IDE kami jika kami ingin menggunakan mana-mana ciri penyelesaian kodnya. Beberapa IDE mempunyai sokongan langsung untuk pemproses anotasi sementara yang lain mungkin memerlukan kami untuk menambahkan direktori ini ke jalan binaan.

Sebagai alternatif, jika kita menggunakan Android dengan Gradle, kita dapat memasukkan kedua-dua kebergantungan:

compile 'com.google.dagger:dagger:2.16' annotationProcessor 'com.google.dagger:dagger-compiler:2.16'

Sekarang kita mempunyai Dagger dalam projek kita, mari buat contoh aplikasi untuk melihat bagaimana ia berfungsi.

4. Pelaksanaan

Sebagai contoh, kami akan berusaha membina kereta dengan menyuntik komponennya.

Kini, Dagger menggunakan anotasi JSR-330 standard di banyak tempat, salah satunya ialah @Inject.

Kita boleh menambahkan anotasi pada medan atau pembina. Tetapi, kerana Dagger tidak menyokong suntikan di bidang swasta , kami akan melakukan suntikan konstruktor untuk mengekalkan enkapsulasi:

public class Car { private Engine engine; private Brand brand; @Inject public Car(Engine engine, Brand brand) { this.engine = engine; this.brand = brand; } // getters and setters }

Seterusnya, kami akan melaksanakan kod untuk melakukan suntikan. Lebih khusus lagi, kami akan membuat:

  • satu modul , yang merupakan kelas yang menyediakan atau membina kebergantungan objek ', dan
  • satu komponen , yang adalah satu antara muka yang digunakan untuk menjana penyuntik

Projek yang kompleks mungkin mengandungi banyak modul dan komponen tetapi kerana kita berurusan dengan program yang sangat asas, masing-masing sudah cukup.

Mari lihat bagaimana melaksanakannya.

4.1. Modul

Untuk membuat modul, kita perlu memberi penjelasan kelas dengan anotasi @Module . Anotasi ini menunjukkan bahawa kelas dapat menyediakan pergantungan kepada wadah:

@Module public class VehiclesModule { }

Kemudian, kita perlu menambahkan penjelasan @Provides mengenai kaedah yang membina kebergantungan kita :

@Module public class VehiclesModule { @Provides public Engine provideEngine() { return new Engine(); } @Provides @Singleton public Brand provideBrand() { return new Brand("Baeldung"); } }

Juga, perhatikan bahawa kita dapat mengkonfigurasi ruang lingkup kebergantungan tertentu. Dalam kes ini, kami memberikan ruang lingkup tunggal untuk contoh Jenama kami sehingga semua contoh kereta berkongsi objek jenama yang sama.

4.2. Komponen

Melanjutkan, kami akan membuat antara muka komponen kami . Ini adalah kelas yang akan menghasilkan contoh Car, bergantung kepada suntikan yang disediakan oleh VehiclesModule .

Ringkasnya, kita memerlukan tandatangan kaedah yang mengembalikan Kereta dan kita perlu menandakan kelas dengan anotasi @Component :

@Singleton @Component(modules = VehiclesModule.class) public interface VehiclesComponent { Car buildCar(); }

Perhatikan bagaimana kami lulus kelas modul kami sebagai hujah kepada penjelasan @Component . Sekiranya kita tidak melakukan itu, Dagger tidak akan tahu bagaimana membina pergantungan kereta.

Juga, kerana modul kami menyediakan objek tunggal, kami mesti memberikan ruang lingkup yang sama untuk komponen kami kerana Dagger tidak membenarkan komponen yang tidak dipotong merujuk kepada ikatan yang dilingkupi .

4.3. Kod Pelanggan

Akhirnya, kita dapat menjalankan kompilasi mvn untuk mencetuskan pemproses anotasi dan menghasilkan kod penyuntik.

Selepas itu, kami akan menemui pelaksanaan komponen kami dengan nama yang sama dengan antara muka, hanya awalan dengan " Dagger ":

@Test public void givenGeneratedComponent_whenBuildingCar_thenDependenciesInjected() { VehiclesComponent component = DaggerVehiclesComponent.create(); Car carOne = component.buildCar(); Car carTwo = component.buildCar(); Assert.assertNotNull(carOne); Assert.assertNotNull(carTwo); Assert.assertNotNull(carOne.getEngine()); Assert.assertNotNull(carTwo.getEngine()); Assert.assertNotNull(carOne.getBrand()); Assert.assertNotNull(carTwo.getBrand()); Assert.assertNotEquals(carOne.getEngine(), carTwo.getEngine()); Assert.assertEquals(carOne.getBrand(), carTwo.getBrand()); }

5. Analogi Musim Semi

Mereka yang biasa dengan Spring mungkin telah memperhatikan beberapa persamaan antara kedua kerangka tersebut.

Keris ini @Module anotasi menjadikan bekas menyedari kelas dengan cara yang hampir sama seperti mana-mana anotasi stereotaip Spring (contohnya, @Service , @Controller ...). Begitu juga, @Provides dan @Component hampir sama dengan Spring @Bean dan @Lookup masing-masing.

Spring juga mempunyai anotasi @Scope , yang berkorelasi dengan @Singleton , walaupun perhatikan di sini sudah ada perbezaan lain bahawa Spring menganggap skop singleton secara lalai sementara Dagger secara lalai dengan apa yang disebut oleh pembangun Spring sebagai skop prototaip, menggunakan kaedah penyedia setiap kali kebergantungan diperlukan.

6. Kesimpulannya

Dalam artikel ini, kami membahas cara menyiapkan dan menggunakan Dagger 2 dengan contoh asas. Kami juga mempertimbangkan perbezaan antara suntikan jangka masa dan waktu kompilasi.

Seperti biasa, semua kod dalam artikel boleh didapati di GitHub.