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 は、タイプLongidとタイプStringvalueを持つ単純なBeanです。

これで完了です。アプリケーションを実行すると、 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アーティファクトのバージョンだけです。 後でブートライブラリと依存関係をアップグレードする必要がある場合は、ブートバージョンを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アノテーションとMockMVCspring-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接続、および資格情報の指定には時間を費やしませんでした。 ソリッドブートのデフォルトの恩恵を受けているので、追加の構成は必要ありません。 ただし、もちろん、これらの詳細はすべて、必要に応じて構成できます。

5. メールスターター

エンタープライズ開発で非常に一般的なタスクは電子メールの送信であり、JavaMailAPIを直接処理することは通常困難な場合があります。

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の最新バージョンは、Maven中央リポジトリにあります。

テストのソースコードは次のとおりです。

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

テストでは、@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スターターを使用する利点を要約してみましょう。

  • pomの管理性を向上させる
  • 本番環境に対応し、テストおよびサポートされている依存関係の構成
  • プロジェクトの全体的な構成時間を短縮します

スターターの実際のリストはここにあります。 例のソースコードはここにあります。