1. 概要

コアSpringBoot 開発者は、人気のあるオープンソースプロジェクトのほとんどに starters を提供していますが、これらに限定されません。

独自のカスタムスターターを作成することもできます。 組織内で使用するための内部ライブラリがある場合、それがSpring Bootコンテキストで使用される場合は、そのスターターも作成することをお勧めします。

これらのスターターにより、開発者は長い構成を回避し、開発を迅速に開始できます。 ただし、バックグラウンドで多くのことが発生しているため、アノテーションまたはpom.xmlに依存関係を含めるだけで非常に多くの機能が有効になる方法を理解するのが難しい場合があります。

この記事では、Spring Bootの魔法をわかりやすく説明して、舞台裏で何が起こっているかを確認します。 次に、これらの概念を使用して、独自のカスタムライブラリのスターターを作成します。

2. Spring Bootの自動構成の謎を解き明かす

2.1. 自動構成クラス

Spring Bootが起動すると、クラスパスでspring.factoriesという名前のファイルが検索されます。 このファイルはMETA-INF[X40X]ディレクトリにあります。 spring-boot-autoconfigureプロジェクトからのこのファイルのスニペットを見てみましょう。

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

このファイルは、SpringBootが実行しようとするさまざまな構成クラスに名前をマップします。 したがって、このスニペットに従って、Spring BootはRabbitMQ、Cassandra、MongoDB、およびHibernateのすべての構成クラスを実行しようとします。

これらのクラスが実際に実行されるかどうかは、クラスパス上の依存クラスの存在に依存します。 たとえば、MongoDBのクラスがクラスパスで見つかった場合、 MongoAutoConfiguration が実行され、すべてのmongo関連のBeanが初期化されます。

この条件付き初期化は、@ConditionalOnClassアノテーションによって有効になります。 MongoAutoConfiguration クラスのコードスニペットを見て、その使用法を確認しましょう。

@Configuration
@ConditionalOnClass(MongoClient.class)
@EnableConfigurationProperties(MongoProperties.class)
@ConditionalOnMissingBean(type = "org.springframework.data.mongodb.MongoDbFactory")
public class MongoAutoConfiguration {
    // configuration code
}

ここで、 MongoClient がクラスパスで使用可能な場合、この構成クラスは、デフォルトの構成設定で初期化されたMongoClientをSpringBeanファクトリに設定して実行されます。

2.2. application.propertiesファイルのカスタムプロパティ

Spring Bootは、いくつかの事前構成されたデフォルトを使用してBeanを初期化します。 これらのデフォルトをオーバーライドするには、通常、application.propertiesファイルで特定の名前で宣言します。 これらのプロパティは、SpringBootコンテナによって自動的に取得されます。

それがどのように機能するか見てみましょう。

MongoAutoConfiguration のコードスニペットでは、 @EnableConfigurationProperties アノテーションは、カスタムプロパティのコンテナーとして機能するMongoPropertiesクラスで宣言されています。

@ConfigurationProperties(prefix = "spring.data.mongodb")
public class MongoProperties {

    private String host;

    // other fields with standard getters and setters
}

プレフィックスとフィールド名は、application.propertiesファイルのプロパティの名前になります。 したがって、MongoDBの host を設定するには、プロパティファイルに次のように書き込むだけです。

spring.data.mongodb.host = localhost

同様に、クラスの他のフィールドの値は、プロパティファイルを使用して設定できます。

3. カスタムスターターの作成

セクション2の概念に基づいて、カスタムスターターを作成するには、次のコンポーネントを作成する必要があります。

  1. ライブラリの自動構成クラスと、カスタム構成のプロパティクラス。
  2. ライブラリと自動構成プロジェクトの依存関係を取り込むためのスターターpom

デモンストレーション用に、シンプルなあいさつライブラリを作成しました。このライブラリは、さまざまな時間帯のあいさつメッセージを構成パラメータとして受け取り、あいさつメッセージを出力します。 また、自動構成モジュールとスターターモジュールの使用法を示すために、サンプルのSpringBootアプリケーションを作成します。

3.1. 自動構成モジュール

自動構成モジュールgreeter-spring-boot-autoconfigureと呼びます。 このモジュールには、2つの主要なクラスがあります。 GreeterProperties は、 application.properties ファイルを介してカスタムプロパティを設定できるようにし、 GreeterAutoConfiguartion は、greeterライブラリのBeanを作成します。

両方のクラスのコードを見てみましょう。

@ConfigurationProperties(prefix = "baeldung.greeter")
public class GreeterProperties {

    private String userName;
    private String morningMessage;
    private String afternoonMessage;
    private String eveningMessage;
    private String nightMessage;

    // standard getters and setters

}
@Configuration
@ConditionalOnClass(Greeter.class)
@EnableConfigurationProperties(GreeterProperties.class)
public class GreeterAutoConfiguration {

    @Autowired
    private GreeterProperties greeterProperties;

    @Bean
    @ConditionalOnMissingBean
    public GreetingConfig greeterConfig() {

        String userName = greeterProperties.getUserName() == null
          ? System.getProperty("user.name") 
          : greeterProperties.getUserName();
        
        // ..

        GreetingConfig greetingConfig = new GreetingConfig();
        greetingConfig.put(USER_NAME, userName);
        // ...
        return greetingConfig;
    }

    @Bean
    @ConditionalOnMissingBean
    public Greeter greeter(GreetingConfig greetingConfig) {
        return new Greeter(greetingConfig);
    }
}

また、spring.factoriesファイルをsrc/ main / resources /META-INFディレクトリに次の内容で追加する必要があります。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.baeldung.greeter.autoconfigure.GreeterAutoConfiguration

クラスGreeterがクラスパスに存在する場合、アプリケーションの起動時にGreeterAutoConfigurationクラスが実行されます。 正常に実行されると、 GreeterProperties クラスを介してプロパティを読み取ることにより、SpringアプリケーションコンテキストにGreeterConfigおよびGreeterBeanが読み込まれます。

@ConditionalOnMissingBean アノテーションは、これらのBeanがまだ存在しない場合にのみ作成されるようにします。 これにより、開発者は、 @Configuration クラスの1つで独自のBeanを定義することにより、自動構成されたBeanを完全にオーバーライドできます。

3.2. pom.xmlを作成しています

次に、自動構成モジュールとグリーターライブラリの依存関係を取り込むスターターpomを作成しましょう。

命名規則に従って、コアSpring Bootチームによって管理されていないすべてのスターターは、ライブラリ名で始まり、その後に接尾辞-spring-boot-starterが続く必要があります。 したがって、スターターを greeter-spring-boot-starter:と呼びます。

<project ...>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.baeldung</groupId>
    <artifactId>greeter-spring-boot-starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <greeter.version>0.0.1-SNAPSHOT</greeter.version>
        <spring-boot.version>2.2.6.RELEASE</spring-boot.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>${spring-boot.version}</version>
        </dependency>

        <dependency>
            <groupId>com.baeldung</groupId>
            <artifactId>greeter-spring-boot-autoconfigure</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>com.baeldung</groupId>
            <artifactId>greeter</artifactId>
            <version>${greeter.version}</version>
        </dependency>

    </dependencies>

</project>

3.3. スターターの使用

スターターを使用するgreeter-spring-boot-sample-appを作成しましょう。 pom.xml で、依存関係として追加する必要があります。

<dependency>
    <groupId>com.baeldung</groupId>
    <artifactId>greeter-spring-boot-starter</artifactId>
    <version>${greeter-starter.version}</version>
</dependency>

Spring Bootはすべてを自動的に構成し、GreeterBeanを注入して使用する準備が整います。

GreeterProperties のデフォルト値のいくつかを、application.propertiesファイルでbaeldung.greeterプレフィックスを付けて定義することにより、変更してみましょう。

baeldung.greeter.userName=Baeldung
baeldung.greeter.afternoonMessage=Woha\ Afternoon

最後に、アプリケーションで Greeterbeanを使用しましょう。

@SpringBootApplication
public class GreeterSampleApplication implements CommandLineRunner {

    @Autowired
    private Greeter greeter;

    public static void main(String[] args) {
        SpringApplication.run(GreeterSampleApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        String message = greeter.greet();
        System.out.println(message);
    }
}

4. 結論

このクイックチュートリアルでは、カスタムSpring Bootスターターの展開と、これらのスターターと自動構成メカニズムがバックグラウンドでどのように機能して多くの手動構成を排除するかに焦点を当てました。

この記事で作成したすべてのモジュールの完全なソースコードは、GitHubにあります。