Spring Boot Starters介紹

對於任何一個複雜項目來說,依賴關係都是一個非常需要注意和消息的方面,雖然重要,但是我們也不需要花太多的時間在上面,因為依賴畢竟只是框架,我們重點需要關注的還是程序業務本身。

這就是為什麼會有Spring Boot starters的原因。Starter POMs 是一系列可以被引用的依賴集合,只需要引用一次就可以獲得所有需要使用到的依賴。

Spring Boot有超過30個starts, 本文將介紹比較常用到的幾個。

Web Start

如果我們需要開發MVC程序或者REST服務,那麼我們需要使用到Spring MVC,Tomcat,JSON等一系列的依賴。但是使用Spring Boot Start,一個依賴就夠了:

<code><dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-web/<artifactid>
/<dependency>
/<code>

現在我們就可以創建REST Controller了:

<code>@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();
}

}

/<genericentity>/<genericentity>/<code>

這樣我們就完成了一個非常簡單的Spring Web程序。

Test Starter

在測試中,我們通常會用到Spring Test, JUnit, Hamcrest, 和 Mockito這些依賴,Spring也有一個starter集合:

<code><dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-test/<artifactid>
<scope>test/<scope>
/<dependency>
/<code>

注意,你並不需要指定artifact的版本號,因為這一切都是從spring-boot-starter-parent 的版本號繼承過來的。後面升級的話,只需要升級parent的版本即可。具體的應用可以看下本文的例子。

接下來讓我們測試一下剛剛創建的controller:

這裡我們使用mock。

<code>@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(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)));
}
}
/<code>

上面的例子,我們測試了/entity/all接口,並且驗證了返回的JSON。

這裡@WebAppConfiguration 和 MockMVC 是屬於 spring-test 模塊, hasSize 是一個Hamcrest 的匹配器, @Before 是一個 JUnit 註解.所有的一切,都包含在一個starter中。

Data JPA Starter

如果想使用JPA,我們可以這樣:

<code><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>
/<code>

我們接下來創建一個repository:

<code>public interface GenericEntityRepository extends JpaRepository<genericentity> {}
/<genericentity>/<code>

然後是JUnit測試:

<code>@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(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.findById(genericEntity.getId()).orElse(null);

assertNotNull(foundedEntity);
assertEquals(genericEntity.getValue(), foundedEntity.getValue());
}
}
/<code>

這裡我們測試了JPA自帶的save, findById方法。 可以看到我們沒有做任何的配置,Spring boot自動幫我們完成了所有操作。

Mail Starter

在企業開發中,發送郵件是一件非常常見的事情,如果直接使用 Java Mail API會比較複雜。如果使用Spring boot:

<code><dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-mail/<artifactid>
/<dependency>
/<code>

這樣我們就可以直接使用JavaMailSender,前提是需要配置mail的連接屬性如下:

<code>spring.mail.host=localhost
spring.mail.port=25
spring.mail.default-encoding=UTF-8
/<code>

接下來我們來寫一些測試案例。

為了發送郵件,我們需要一個簡單的SMTP服務器。在本例中,我們使用Wiser。

<code><dependency>
<groupid>org.subethamail/<groupid>
<artifactid>subethasmtp/<artifactid>
<version>3.1.7/<version>
<scope>test/<scope>
/<dependency>
/<code>

下面是如何發送的代碼:

<code>@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class SpringBootMailTest {
@Autowired
private 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";

@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<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;
}
}
/<wisermessage>/<code>

在上面的例子中,@Before 和 @After 分別用來啟動和關閉郵件服務器。

結論

更多內容請訪問:flydean的博客 flydean.com


Spring Boot Starters介紹


分享到:


相關文章: