javascript
Spring Boot Starters介绍
文章目錄
- Web Start
- Test Starter
- Data JPA Starter
- Mail Starter
- 結論
對于任何一個復雜項目來說,依賴關系都是一個非常需要注意和消息的方面,雖然重要,但是我們也不需要花太多的時間在上面,因為依賴畢竟只是框架,我們重點需要關注的還是程序業務本身。
這就是為什么會有Spring Boot starters的原因。Starter POMs 是一系列可以被引用的依賴集合,只需要引用一次就可以獲得所有需要使用到的依賴。
Spring Boot有超過30個starts, 本文將介紹比較常用到的幾個。
Web Start
如果我們需要開發MVC程序或者REST服務,那么我們需要使用到Spring MVC,Tomcat,JSON等一系列的依賴。但是使用Spring Boot Start,一個依賴就夠了:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency>現在我們就可以創建REST Controller了:
@RestController public class GenericEntityController {private List<GenericEntity> entityList = new ArrayList<>();@RequestMapping("/entity/all")public List<GenericEntity> 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();} }這樣我們就完成了一個非常簡單的Spring Web程序。
Test Starter
在測試中,我們通常會用到Spring Test, JUnit, Hamcrest, 和 Mockito這些依賴,Spring也有一個starter集合:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> </dependency>注意,你并不需要指定artifact的版本號,因為這一切都是從spring-boot-starter-parent 的版本號繼承過來的。后面升級的話,只需要升級parent的版本即可。具體的應用可以看下本文的例子。
接下來讓我們測試一下剛剛創建的controller:
這里我們使用mock。
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = Application.class) @WebAppConfiguration public class SpringBootApplicationIntegrationTest {@Autowiredprivate WebApplicationContext webApplicationContext;private MockMvc mockMvc;@Beforepublic void setupMockMvc() {mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();}@Testpublic 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)));} }上面的例子,我們測試了/entity/all接口,并且驗證了返回的JSON。
這里@WebAppConfiguration 和 MockMVC 是屬于 spring-test 模塊, hasSize 是一個Hamcrest 的匹配器, @Before 是一個 JUnit 注解.所有的一切,都包含在一個starter中。
Data JPA Starter
如果想使用JPA,我們可以這樣:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency>我們接下來創建一個repository:
public interface GenericEntityRepository extends JpaRepository<GenericEntity, Long> {}然后是JUnit測試:
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = Application.class) public class SpringBootJPATest {@Autowiredprivate GenericEntityRepository genericEntityRepository;@Testpublic void givenGenericEntityRepository_whenSaveAndRetreiveEntity_thenOK() {GenericEntity genericEntity =genericEntityRepository.save(new GenericEntity("test"));GenericEntity foundedEntity =genericEntityRepository.findById(genericEntity.getId()).orElse(null);assertNotNull(foundedEntity);assertEquals(genericEntity.getValue(), foundedEntity.getValue());} }這里我們測試了JPA自帶的save, findById方法。 可以看到我們沒有做任何的配置,Spring boot自動幫我們完成了所有操作。
Mail Starter
在企業開發中,發送郵件是一件非常常見的事情,如果直接使用 Java Mail API會比較復雜。如果使用Spring boot:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency>這樣我們就可以直接使用JavaMailSender,前提是需要配置mail的連接屬性如下:
spring.mail.host=localhost spring.mail.port=25 spring.mail.default-encoding=UTF-8接下來我們來寫一些測試案例。
為了發送郵件,我們需要一個簡單的SMTP服務器。在本例中,我們使用Wiser。
<dependency><groupId>org.subethamail</groupId><artifactId>subethasmtp</artifactId><version>3.1.7</version><scope>test</scope> </dependency>下面是如何發送的代碼:
@RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) public class SpringBootMailTest {@Autowiredprivate JavaMailSender javaMailSender;private Wiser wiser;private String userTo = "user2@localhost";private String userFrom = "user1@localhost";private String subject = "Test subject";private String textMail = "Text subject mail";@Beforepublic void setUp() throws Exception {final int TEST_PORT = 25;wiser = new Wiser(TEST_PORT);wiser.start();}@Afterpublic void tearDown() throws Exception {wiser.stop();}@Testpublic void givenMail_whenSendAndReceived_thenCorrect() throws Exception {SimpleMailMessage message = composeEmailMessage();javaMailSender.send(message);List<WiserMessage> 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;} }在上面的例子中,@Before 和 @After 分別用來啟動和關閉郵件服務器。
結論
本文介紹了一些常用的starts,具體例子可以參考 spring-boot-starts
更多精彩內容且看:
- 區塊鏈從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特幣等持續更新
- Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續更新
- Spring 5.X系列教程:滿足你對Spring5的一切想象-持續更新
- java程序員從小工到專家成神之路(2020版)-持續更新中,附詳細文章教程
更多教程請參考 flydean的博客
總結
以上是生活随笔為你收集整理的Spring Boot Starters介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在Spring boot中修改默认端
- 下一篇: 使用VSCode连接到IBM Cloud