1. Gambaran keseluruhan
Pengurusan ketergantungan adalah aspek kritikal bagi setiap projek yang kompleks. Dan melakukan ini secara manual adalah kurang ideal; semakin banyak masa yang anda habiskan, semakin sedikit masa yang anda ada untuk aspek penting lain dalam projek ini.
Permulaan Spring Boot dibina untuk mengatasi masalah ini dengan tepat. Starter POM adalah sekumpulan deskriptor pergantungan yang boleh anda sertakan dalam aplikasi anda. Anda mendapat perkhidmatan sehenti untuk semua Musim Semi dan teknologi berkaitan yang anda perlukan, tanpa perlu mencari contoh kod dan menyalin-menampal banyak keterangan ketergantungan.
Kami mempunyai lebih daripada 30 permulaan Boot - mari kita lihat sebahagiannya di bahagian berikut.
2. Permulaan Web
Pertama, mari lihat pengembangan perkhidmatan REST; kita boleh menggunakan perpustakaan seperti Spring MVC, Tomcat dan Jackson - banyak kebergantungan untuk satu aplikasi.
Pemula Spring Boot dapat membantu mengurangkan bilangan pergantungan yang ditambahkan secara manual hanya dengan menambahkan satu pergantungan. Oleh itu, daripada menentukan kebergantungan secara manual, tambahkan satu starter seperti contoh berikut:
org.springframework.boot spring-boot-starter-web
Sekarang kita boleh membuat pengawal REST. Demi kesederhanaan, kami tidak akan menggunakan pangkalan data dan fokus pada pengawal 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 jenis Long dan nilai jenis String .
Itu sahaja - dengan aplikasi berjalan, anda boleh mengakses // localhost: 8080 / entiti / semua dan periksa pengawal berfungsi.
Kami telah membuat aplikasi REST dengan konfigurasi yang minimum.
3. Permulaan Ujian
Untuk ujian, kami biasanya menggunakan set perpustakaan berikut: Spring Test, JUnit, Hamcrest, dan Mockito. Kami boleh memasukkan semua perpustakaan ini secara manual, tetapi Spring Boot starter dapat digunakan untuk memasukkan perpustakaan ini secara automatik dengan cara berikut:
org.springframework.boot spring-boot-starter-test test
Perhatikan bahawa anda tidak perlu menentukan nombor versi artifak. Spring Boot akan mengetahui versi mana yang akan digunakan - yang perlu anda nyatakan adalah versi artifak spring-boot-starter-parent . Sekiranya di kemudian hari anda perlu menaik taraf pustaka dan pergantungan Boot, cukup tingkatkan versi Boot di satu tempat dan ia akan menguruskan yang lain.
Mari kita betul-betul menguji alat kawalan yang kita buat dalam contoh sebelumnya.
Terdapat dua cara untuk menguji pengawal:
- Menggunakan persekitaran olok-olok
- Menggunakan bekas Servlet tertanam (seperti Tomcat atau Jetty)
Dalam contoh ini kita akan menggunakan persekitaran 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))); } }
Ujian di atas memanggil / entiti / semua titik akhir dan mengesahkan bahawa tindak balas JSON mengandungi 4 elemen. Agar ujian ini lulus, kami juga harus memulakan senarai kami di kelas pengawal:
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")); } //... }
Apa yang penting di sini ialah anotasi @WebAppConfiguration dan MockMVC adalah sebahagian daripada modul ujian musim bunga , hasSize adalah pencocokan Hamcrest, dan @Sebelum ini adalah anotasi JUnit. Ini semua tersedia dengan mengimport satu pergantungan satu ini.
4. Permulaan JPA Data
Sebilangan besar aplikasi web mempunyai ketekunan - dan JPA itu agak kerap.
Daripada menentukan semua pergantungan yang berkaitan secara manual - mari kita gunakan permulaan:
org.springframework.boot spring-boot-starter-data-jpa com.h2database h2 runtime
Perhatikan bahawa di luar kotak kami mempunyai sokongan automatik untuk sekurang-kurangnya pangkalan data berikut: H2, Derby dan Hsqldb. Dalam contoh kami, kami akan menggunakan H2.
Sekarang mari buat repositori untuk entiti kami:
public interface GenericEntityRepository extends JpaRepository {}
Masa untuk menguji kod. Inilah ujian 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 pangkalan data, sambungan URL, dan bukti kelayakan. Tidak ada konfigurasi tambahan yang diperlukan kerana kami mendapat manfaat daripada default Boot yang kukuh; tetapi tentu saja semua butiran ini masih dapat dikonfigurasi jika perlu.
5. Permulaan Mel
Tugas yang sangat umum dalam pengembangan perusahaan adalah mengirim e-mel, dan berurusan secara langsung dengan Java Mail API biasanya sukar.
Spring Boot starter menyembunyikan kerumitan ini - kebergantungan mel dapat ditentukan dengan cara berikut:
org.springframework.boot spring-boot-starter-mail
Sekarang kita boleh menggunakan JavaMailSender secara langsung , jadi mari kita tulis beberapa ujian.
Untuk tujuan pengujian, kami memerlukan pelayan SMTP yang ringkas. Dalam contoh ini, kami akan menggunakan Wiser. Ini adalah bagaimana kami dapat memasukkannya ke dalam POM kami:
org.subethamail subethasmtp 3.1.7 test
Versi terbaru Wiser boleh didapati di repositori pusat Maven.
Berikut adalah kod sumber untuk ujian:
@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 ujian, kaedah @Sebelum dan @Setelah bertugas memulakan dan menghentikan pelayan mel.
Perhatikan bahawa kami memasang kabel di JavaMailSender - kacang itu dibuat secara automatik oleh Spring Boot .
Sama seperti lalai lain dalam Boot, tetapan e-mel untuk JavaMailSender dapat disesuaikan dalam aplikasi .
spring.mail.host=localhost spring.mail.port=25 spring.mail.properties.mail.smtp.auth=false
Oleh itu, kami mengkonfigurasi pelayan mel di localhost: 25 dan kami tidak memerlukan pengesahan.
6. Kesimpulannya
Dalam artikel ini, kami telah memberikan gambaran keseluruhan mengenai Pemula, menjelaskan mengapa kami memerlukannya dan memberikan contoh bagaimana menggunakannya dalam projek anda.
Mari kita nikmati faedah menggunakan pemula Spring Boot:
- meningkatkan pengurusan pom
- konfigurasi kebergantungan siap produksi, diuji & disokong
- mengurangkan masa konfigurasi keseluruhan projek
Senarai pemula sebenar boleh didapati di sini. Kod sumber untuk contoh boleh didapati di sini.