Einführung zu Spring Boot Starters

Einführung in Spring Boot Starter

1. Überblick

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

Spring Boot-Starter wurden entwickelt, um genau dieses Problem anzugehen. Starter-POMs sind eine Reihe praktischer Abhängigkeitsbeschreibungen, die Sie in Ihre Anwendung aufnehmen können. Sie erhalten alles, was Sie für Spring und verwandte Technologien benötigen, aus einer Hand, ohne Beispielcode durchgehen und jede Menge 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

Betrachten wir zunächst die Entwicklung des REST-Service. 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 Sie lediglich eine Abhängigkeit hinzufügen. Anstatt die Abhängigkeiten manuell anzugeben, fügen Sie einfach einen Starter hinzu, wie im folgenden Beispiel gezeigt:


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

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

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

GenericEntity ist eine einfache Bohne mitid vom TypLong undvalue vom TypString.

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

Wir haben eine REST-Anwendung mit einer recht geringen 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 einbeziehen, aber der Spring Boot-Starter kann verwendet werden, um diese Bibliotheken auf folgende Weise automatisch einzubeziehen:


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

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

Testen wir den Controller, 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 von/entity/allauf 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 undMockMVC Teil desspring-test Moduls sind,hasSize ein Hamcrest Matcher ist und@Before eine JUnit Annotation ist. Diese sind alle verfügbar, indem Sie eine dieser Starter-Abhängigkeiten 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 standardmäßig mindestens die folgenden Datenbanken automatisch unterstützt werden: 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, und der direkte Umgang mit der Java Mail-API kann normalerweise schwierig sein.

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


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

Jetzt können wirJavaMailSenderdirekt verwenden. Schreiben wir also einige Tests.

Zum Testen benötigen wir einen einfachen SMTP-Server. In diesem Beispiel verwenden wir Wiser. So können wir es in unseren POM aufnehmen:


    org.subethamail
    subethasmtp
    3.1.7
    test

Die neueste Version von Wiser finden Sie aufMaven central 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 Bean (JavaMailSender verkabeln - die Bean warautomatically created by Spring Boot.

Wie bei allen anderen Standardeinstellungen beim Booten können die E-Mail-Einstellungen fürJavaMailSender inapplication.properties angepasst werden:

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

Daher haben wir den Mailserver auflocalhost:25konfiguriert 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 für deren Verwendung in Ihren Projekten gegeben.

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

  • Erhöhen Sie die Verwaltbarkeit der Bommel

  • Produktionsbereite, getestete und unterstützte Abhängigkeitskonfigurationen

  • Verringern Sie die gesamte Konfigurationszeit für das Projekt

Die aktuelle Liste der Starter finden Sie inhere. Der Quellcode für die Beispiele isthere.