Pendahuluan tentang Spring Boot Starters

1. Ikhtisar

Manajemen ketergantungan adalah aspek penting dari setiap proyek yang kompleks. Dan melakukan ini secara manual kurang ideal; semakin banyak waktu yang Anda habiskan untuk itu semakin sedikit waktu yang Anda miliki pada aspek penting lainnya dari proyek tersebut.

Pemula Spring Boot dibuat untuk mengatasi masalah ini dengan tepat. Starter POM adalah sekumpulan penjelas dependensi yang dapat Anda sertakan dalam aplikasi Anda. Anda mendapatkan toko serba ada untuk semua Musim Semi dan teknologi terkait yang Anda butuhkan, tanpa harus mencari-cari kode sampel dan salin-tempel banyak deskriptor dependensi.

Kami memiliki lebih dari 30 Boot pemula yang tersedia - mari kita lihat beberapa di antaranya di bagian berikut.

2. Web Starter

Pertama, mari kita lihat mengembangkan layanan REST; kita dapat menggunakan pustaka seperti Spring MVC, Tomcat dan Jackson - banyak dependensi untuk satu aplikasi.

Pemula Spring Boot dapat membantu mengurangi jumlah dependensi yang ditambahkan secara manual hanya dengan menambahkan satu dependensi. Jadi, alih-alih menentukan dependensi secara manual, cukup tambahkan satu starter seperti pada contoh berikut:

 org.springframework.boot spring-boot-starter-web 

Sekarang kita dapat membuat pengontrol REST. Demi kesederhanaan, kami tidak akan menggunakan database dan fokus pada pengontrol REST:

@RestController public class GenericEntityController { private List entityList = new ArrayList(); @RequestMapping("/entity/all") public List findAll() { return entityList; } @RequestMapping(value = "/entity", method = RequestMethod.POST) public GenericEntity addEntity(GenericEntity entity) { entityList.add(entity); return entity; } @RequestMapping("/entity/findby/{id}") public GenericEntity findById(@PathVariable Long id) { return entityList.stream(). filter(entity -> entity.getId().equals(id)). findFirst().get(); } }

The GenericEntity adalah kacang sederhana dengan id tipe Panjang dan nilai tipe String .

Selesai - dengan aplikasi berjalan, Anda dapat mengakses // localhost: 8080 / entity / all dan memeriksa apakah pengontrol berfungsi.

Kami telah membuat aplikasi REST dengan konfigurasi yang cukup minimal.

3. Test Starter

Untuk pengujian kami biasanya menggunakan kumpulan pustaka berikut: Uji Musim Semi, JUnit, Hamcrest, dan Mockito. Kami dapat menyertakan semua pustaka ini secara manual, tetapi Spring Boot starter dapat digunakan untuk menyertakan pustaka ini secara otomatis dengan cara berikut:

 org.springframework.boot spring-boot-starter-test test 

Perhatikan bahwa Anda tidak perlu menentukan nomor versi artefak. Spring Boot akan mencari tahu versi apa yang akan digunakan - yang perlu Anda tentukan hanyalah versi artefak spring-boot-starter-parent . Jika nanti Anda perlu memutakhirkan pustaka dan ketergantungan Boot, cukup tingkatkan versi Boot di satu tempat dan itu akan mengurus sisanya.

Mari kita benar-benar menguji pengontrol yang kita buat di contoh sebelumnya.

Ada dua cara untuk menguji pengontrol:

  • Menggunakan lingkungan tiruan
  • Menggunakan wadah Servlet tertanam (seperti Tomcat atau Jetty)

Dalam contoh ini kita akan menggunakan lingkungan tiruan:

@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) @WebAppConfiguration public class SpringBootApplicationIntegrationTest { @Autowired private WebApplicationContext webApplicationContext; private MockMvc mockMvc; @Before public void setupMockMvc() { mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } @Test public void givenRequestHasBeenMade_whenMeetsAllOfGivenConditions_thenCorrect() throws Exception { MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); mockMvc.perform(MockMvcRequestBuilders.get("/entity/all")). andExpect(MockMvcResultMatchers.status().isOk()). andExpect(MockMvcResultMatchers.content().contentType(contentType)). andExpect(jsonPath("$", hasSize(4))); } }

Tes di atas memanggil titik akhir / entity / all dan memverifikasi bahwa respons JSON berisi 4 elemen. Agar tes ini berhasil, kita juga harus menginisialisasi daftar kita di kelas controller:

public class GenericEntityController { private List entityList = new ArrayList(); { entityList.add(new GenericEntity(1l, "entity_1")); entityList.add(new GenericEntity(2l, "entity_2")); entityList.add(new GenericEntity(3l, "entity_3")); entityList.add(new GenericEntity(4l, "entity_4")); } //... }

Yang penting di sini adalah anotasi @WebAppConfiguration dan MockMVC merupakan bagian dari modul uji pegas , hasSize adalah pencocok Hamcrest, dan @Before adalah anotasi JUnit. Ini semua tersedia dengan mengimpor yang satu ini ketergantungan starter.

4. Data JPA Starter

Sebagian besar aplikasi web memiliki semacam persistensi - dan itu sering kali JPA.

Alih-alih menentukan semua dependensi terkait secara manual - mari kita gunakan starter sebagai gantinya:

 org.springframework.boot spring-boot-starter-data-jpa   com.h2database h2 runtime 

Perhatikan bahwa di luar kotak kami memiliki dukungan otomatis untuk setidaknya database berikut: H2, Derby dan Hsqldb. Dalam contoh kami, kami akan menggunakan H2.

Sekarang mari buat repositori untuk entitas kita:

public interface GenericEntityRepository extends JpaRepository {}

Saatnya menguji kode. Berikut adalah pengujian JUnit:

@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) public class SpringBootJPATest { @Autowired private GenericEntityRepository genericEntityRepository; @Test public void givenGenericEntityRepository_whenSaveAndRetreiveEntity_thenOK() { GenericEntity genericEntity = genericEntityRepository.save(new GenericEntity("test")); GenericEntity foundedEntity = genericEntityRepository.findOne(genericEntity.getId()); assertNotNull(foundedEntity); assertEquals(genericEntity.getValue(), foundedEntity.getValue()); } }

Kami tidak menghabiskan waktu untuk menentukan vendor database, koneksi URL, dan kredensial. Tidak ada konfigurasi tambahan yang diperlukan karena kami memanfaatkan default Boot yang solid; tetapi tentu saja semua detail ini masih dapat dikonfigurasi jika perlu.

5. Mail Starter

Tugas yang sangat umum dalam pengembangan perusahaan adalah mengirim email, dan berurusan langsung dengan Java Mail API biasanya bisa jadi sulit.

Spring Boot starter menyembunyikan kerumitan ini - dependensi email dapat ditentukan dengan cara berikut:

 org.springframework.boot spring-boot-starter-mail 

Sekarang kita bisa langsung menggunakan JavaMailSender , jadi mari kita tulis beberapa tes.

Untuk tujuan pengujian, kami membutuhkan server SMTP sederhana. Dalam contoh ini, kami akan menggunakan Wiser. Beginilah cara kami memasukkannya ke dalam POM kami:

 org.subethamail subethasmtp 3.1.7 test  

Versi terbaru Wiser dapat ditemukan di repositori pusat Maven.

Berikut adalah kode sumber untuk pengujian:

@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) public class SpringBootMailTest { @Autowired private JavaMailSender javaMailSender; private Wiser wiser; private String userTo = "[email protected]"; private String userFrom = "[email protected]"; private String subject = "Test subject"; private String textMail = "Text subject mail"; @Before public void setUp() throws Exception { final int TEST_PORT = 25; wiser = new Wiser(TEST_PORT); wiser.start(); } @After public void tearDown() throws Exception { wiser.stop(); } @Test public void givenMail_whenSendAndReceived_thenCorrect() throws Exception { SimpleMailMessage message = composeEmailMessage(); javaMailSender.send(message); List messages = wiser.getMessages(); assertThat(messages, hasSize(1)); WiserMessage wiserMessage = messages.get(0); assertEquals(userFrom, wiserMessage.getEnvelopeSender()); assertEquals(userTo, wiserMessage.getEnvelopeReceiver()); assertEquals(subject, getSubject(wiserMessage)); assertEquals(textMail, getMessage(wiserMessage)); } private String getMessage(WiserMessage wiserMessage) throws MessagingException, IOException { return wiserMessage.getMimeMessage().getContent().toString().trim(); } private String getSubject(WiserMessage wiserMessage) throws MessagingException { return wiserMessage.getMimeMessage().getSubject(); } private SimpleMailMessage composeEmailMessage() { SimpleMailMessage mailMessage = new SimpleMailMessage(); mailMessage.setTo(userTo); mailMessage.setReplyTo(userFrom); mailMessage.setFrom(userFrom); mailMessage.setSubject(subject); mailMessage.setText(textMail); return mailMessage; } }

Dalam pengujian, metode @Before dan @After bertanggung jawab untuk memulai dan menghentikan server email.

Perhatikan bahwa kita memasang kabel di kacang JavaMailSender - kacang itu secara otomatis dibuat oleh Spring Boot .

Sama seperti default lainnya di Boot, pengaturan email untuk JavaMailSender dapat disesuaikan di application.properties :

spring.mail.host=localhost spring.mail.port=25 spring.mail.properties.mail.smtp.auth=false

Jadi kami mengonfigurasi server email di localhost: 25 dan kami tidak memerlukan autentikasi.

6. Kesimpulan

Dalam artikel ini kami telah memberikan gambaran umum tentang Pemula, menjelaskan mengapa kami membutuhkannya dan memberikan contoh tentang cara menggunakannya dalam proyek Anda.

Mari kita rekap manfaat menggunakan permulaan Spring Boot:

  • meningkatkan pengelolaan pom
  • konfigurasi ketergantungan yang siap produksi, teruji & didukung
  • kurangi waktu konfigurasi keseluruhan untuk proyek tersebut

Daftar permulaan yang sebenarnya dapat ditemukan di sini. Kode sumber untuk contoh dapat ditemukan di sini.