1概要

依存関係管理は、あらゆる複雑なプロジェクトの重要な側面です。そしてこれを手動で行うことは理想的とは言えません。あなたがそれに費やした時間が長ければ長いほど、プロジェクトの他の重要な側面に費やす時間が少なくなります。

Spring Bootスターターはまさにこの問題を解決するために作られました。スターターPOMは、アプリケーションに含めることができる便利な依存関係記述子のセットです。サンプルコードを調べたり、依存関係記述子をペーストしたりすることなく、必要なすべてのSpringおよび関連テクノロジをワンストップで入手できます。

私たちには30以上のブートスターターがあります – それらのうちのいくつかを以下のセクションで見てみましょう。


2 Webスターター

まず、RESTサービスの開発を見てみましょう。 Spring MVC、Tomcat、Jacksonのようなライブラリを使用することができます。これは単一のアプリケーションに対する多くの依存関係です。

Spring Bootスターターは、依存関係を1つ追加するだけで、手動で追加された依存関係の数を減らすのに役立ちます。したがって、依存関係を手動で指定する代わりに、次の例のようにスターターを1つ追加するだけです。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

これでRESTコントローラを作成できます。簡単にするために、データベースを使用せず、RESTコントローラーに焦点を当てません。

@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

は、

id

型が

Long



value

型が

String

の単純なBeanです。

アプリケーションが実行されている状態で、http://localhost:8080/springbootapp/entity/all[

http://localhost:8080/entity/all

]にアクセスして、コントローラが動作していることを確認できます。

最小限の設定でRESTアプリケーションを作成しました。


3テストスターター

テストには、通常、Spring Test、JUnit、Hamcrest、およびMockitoのライブラリセットを使用します。これらのライブラリはすべて手動で含めることができますが、次のようにSpring Bootスターターを使用してこれらのライブラリを自動的に含めることができます。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

成果物のバージョン番号を指定する必要はありません。

Spring Bootはどのバージョンを使うべきかを理解するでしょう – あなたが指定する必要があるのは

spring-boot-starter-parent

artifactのバージョンだけです。後でブートライブラリと依存関係をアップグレードする必要がある場合は、ブートバージョンを1か所でアップグレードするだけで残りの処理が行われます。

前の例で作成したコントローラを実際にテストしましょう。

コントローラをテストする方法は2つあります。

  • モック環境を使う

  • 埋め込まれたサーブレットコンテナを使う(TomcatやJettyのように)

この例では、モック環境を使用します。

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

上記のテストは

/entity/all

エンドポイントを呼び出し、JSON応答に4つの要素が含まれていることを確認します。このテストに合格するには、コントローラクラスのリストも初期化する必要があります。

public class GenericEntityController {
    private List<GenericEntity> 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"));
    }
   //...
}

ここで重要なのは、

@ WebAppConfiguration

アノテーションと

MockMVC



spring-test

モジュールの一部であり、

hasSize

がHamcrestのマッチャーであり、

@ Before

がJUnitアノテーションであることです。これらはすべて、このスターター依存関係を1つインポートすることによって使用可能になります。


4データJPAスターター

ほとんどのWebアプリケーションはある種の永続性を持っています – そしてそれはかなり頻繁に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>

箱から出してすぐに私たちは少なくとも次のデータベースを自動的にサポートしていることに注意してください:H2、DerbyとHsqldb。この例では、H2を使用します。

それでは、エンティティのリポジトリを作成しましょう。

public interface GenericEntityRepository extends JpaRepository<GenericEntity, Long> {}

コードをテストする時間です。これが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());
    }
}

データベースベンダー、URL接続、認証情報の指定には時間をかけませんでした。しっかりとしたBootのデフォルトから恩恵を受けるので、追加の設定は必要ありません。しかしもちろん、これらの詳細はすべて必要に応じて設定できます。


5メールスターター

エンタープライズ開発における非常に一般的なタスクは電子メールの送信です。通常、Java Mail APIを直接処理することは困難です。

Spring Bootスターターはこの複雑さを隠します – メールの依存関係は次のように指定することができます。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

これで

JavaMailSender

を直接使用できるようになりましたので、いくつかテストを書きましょう。

テスト目的のためには、単純なSMTPサーバーが必要です。この例では、Wiserを使用します。これが、POMに含める方法です。

<dependency>
    <groupId>org.subethamail</groupId>
    <artifactId>subethasmtp</artifactId>
    <version>3.1.7</version>
    <scope>test</scope>
</dependency>

Wiserの最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Csubethasmtp[Maven central repository]にあります。

これがテストのソースコードです。

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

メソッドがメールサーバーの起動と停止を担当します。


JavaMailSender

Beanに接続していることに注意してください。このBeanはSpring Bootによって自動的に作成されたものです。

Bootの他のデフォルトと同様に、

JavaMailSender

の電子メール設定は

application.properties

でカスタマイズできます。

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

そこで、メールサーバーを

localhost:25

に設定し、認証を要求しませんでした。


6. 結論

この記事では、スターターの概要、それらがなぜ必要なのかを説明し、あなたのプロジェクトでそれらを使用する方法の例を提供しました。

Spring Bootスターターを使用する利点を要約しましょう。

ポンの管理性を向上

  • 生産準備完了、テスト済み

  • プロジェクトの全体的な設定時間を短縮

スターターの実際のリストはhttps://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters[ここ]にあります。

例のソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-boot-ops[ここ]にあります。