Einführung in Spring Boot Starter

1. Übersicht

Das Abhängigkeitsmanagement ist ein kritischer Aspekt jedes komplexen Projekts. Und dies manuell zu tun ist nicht ideal; Je mehr Zeit Sie damit verbracht haben, desto weniger Zeit haben Sie für die anderen wichtigen Aspekte des Projekts.

Spring Boot-Starter wurden entwickelt, um genau dieses Problem zu lösen. Starter-POMs sind eine Reihe praktischer Abhängigkeitsbeschreibungen, die Sie in Ihre Anwendung aufnehmen können. Sie erhalten eine zentrale Anlaufstelle für alle benötigten Spring- und verwandten Technologien, ohne Beispielcode durchsuchen und viele Abhängigkeitsbeschreibungen kopieren und einfügen zu müssen.

Wir haben mehr als 30 Boot-Starter zur Verfügung - einige davon finden Sie in den folgenden Abschnitten.

2. Der Webstarter

Schauen wir uns zunächst die Entwicklung des REST-Service an. Wir können Bibliotheken wie Spring MVC, Tomcat und Jackson verwenden - viele Abhängigkeiten für eine einzelne Anwendung.

Spring Boot-Starter können dazu beitragen, die Anzahl der manuell hinzugefügten Abhängigkeiten zu verringern, indem nur eine Abhängigkeit hinzugefügt wird. Anstatt die Abhängigkeiten manuell anzugeben, fügen Sie einfach einen Starter wie im folgenden Beispiel hinzu:

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

Jetzt können wir einen REST-Controller erstellen. Der Einfachheit halber werden wir die Datenbank nicht verwenden und uns auf den REST-Controller konzentrieren:

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

Die GenericEntity ist eine einfache Bean mit der ID vom Typ Long und dem Wert vom Typ String .

Das war's - während die Anwendung ausgeführt wird, können Sie auf // localhost: 8080 / entity / all zugreifen und überprüfen, ob der Controller funktioniert.

Wir haben eine REST-Anwendung mit einer recht minimalen Konfiguration erstellt.

3. Der Teststarter

Zum Testen verwenden wir normalerweise die folgenden Bibliotheken: Spring Test, JUnit, Hamcrest und Mockito. Wir können alle diese Bibliotheken manuell einschließen, aber der Spring Boot-Starter kann verwendet werden, um diese Bibliotheken auf folgende Weise automatisch einzuschließen:

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

Beachten Sie, dass Sie die Versionsnummer eines Artefakts nicht angeben müssen. Spring Boot findet heraus, welche Version verwendet werden soll. Sie müssen lediglich die Version des übergeordneten Spring-Boot-Starter- Artefakts angeben . Wenn Sie später die Boot-Bibliothek und die Abhängigkeiten aktualisieren müssen, aktualisieren Sie einfach die Boot-Version an einem Ort, und der Rest wird erledigt.

Lassen Sie uns den Controller testen, den wir im vorherigen Beispiel erstellt haben.

Es gibt zwei Möglichkeiten, den Controller zu testen:

  • Verwenden der Scheinumgebung
  • Verwenden des eingebetteten Servlet-Containers (wie Tomcat oder Jetty)

In diesem Beispiel verwenden wir eine Scheinumgebung:

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

Der obige Test ruft den Endpunkt / entity / all auf und überprüft, ob die JSON-Antwort 4 Elemente enthält. Damit dieser Test erfolgreich ist, müssen wir auch unsere Liste in der Controller-Klasse initialisieren:

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")); } //... }

Was hier wichtig ist , ist , dass @WebAppConfiguration Annotation und MockMVC ist Teil des federTestModul, hasSize ist ein hamcrest Matcher und @Before ist eine JUnit Anmerkung. Diese sind alle verfügbar, indem Sie diese eine Starter-Abhängigkeit importieren.

4. Der Data JPA Starter

Die meisten Webanwendungen haben eine gewisse Persistenz - und das ist ziemlich oft JPA.

Anstatt alle zugehörigen Abhängigkeiten manuell zu definieren, gehen wir stattdessen zum Starter:

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

Beachten Sie, dass wir standardmäßig mindestens die folgenden Datenbanken automatisch unterstützen: H2, Derby und Hsqldb. In unserem Beispiel verwenden wir H2.

Erstellen wir nun das Repository für unsere Entität:

public interface GenericEntityRepository extends JpaRepository {}

Zeit, den Code zu testen. Hier ist der JUnit-Test:

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

Wir haben keine Zeit damit verbracht, den Datenbankanbieter, die URL-Verbindung und die Anmeldeinformationen anzugeben. Es ist keine zusätzliche Konfiguration erforderlich, da wir von den soliden Boot-Standardeinstellungen profitieren. Natürlich können alle diese Details bei Bedarf weiterhin konfiguriert werden.

5. Der Mail-Starter

Eine sehr häufige Aufgabe in der Unternehmensentwicklung ist das Senden von E-Mails. Der direkte Umgang mit der Java Mail-API kann normalerweise schwierig sein.

Der Spring Boot-Starter verbirgt diese Komplexität - E-Mail-Abhängigkeiten können folgendermaßen angegeben werden:

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

Jetzt können wir JavaMailSender direkt verwenden. Schreiben wir also einige Tests.

Zu Testzwecken benötigen wir einen einfachen SMTP-Server. In diesem Beispiel verwenden wir Wiser. So können wir es in unser POM aufnehmen:

 org.subethamail subethasmtp 3.1.7 test  

Die neueste Version von Wiser finden Sie im zentralen Maven-Repository.

Hier ist der Quellcode für den Test:

@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; } }

Im Test sind die Methoden @Before und @After für das Starten und Stoppen des Mailservers zuständig.

Beachten Sie, dass wir die JavaMailSender- Bean verkabeln - die Bean wurde automatisch von Spring Boot erstellt .

Wie bei allen anderen Standardeinstellungen in Boot können die E-Mail-Einstellungen für JavaMailSender in application.properties angepasst werden :

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

Also haben wir den Mailserver auf localhost: 25 konfiguriert und keine Authentifizierung benötigt.

6. Fazit

In diesem Artikel haben wir einen Überblick über Starter gegeben, erklärt, warum wir sie benötigen, und Beispiele zur Verwendung in Ihren Projekten bereitgestellt.

Lassen Sie uns die Vorteile der Verwendung von Spring Boot-Startern zusammenfassen:

  • Erhöhen Sie die Pom-Verwaltbarkeit
  • Produktionsbereite, getestete und unterstützte Abhängigkeitskonfigurationen
  • Verringern Sie die Gesamtkonfigurationszeit für das Projekt

Die aktuelle Starterliste finden Sie hier. Der Quellcode für die Beispiele finden Sie hier.