Spring Bootでカスタムスターターを作成する
1. 概要
コアSpring Boot開発者は、人気のあるオープンソースプロジェクトのほとんどにstartersを提供していますが、これらに限定されません。
We can also write our own custom starters。 組織内で使用するための内部ライブラリがある場合、Spring Bootコンテキストで使用する場合は、そのスターターも作成することをお勧めします。
これらのスターターにより、開発者は長時間の構成を回避し、迅速に開発を開始できます。 ただし、バックグラウンドで多くのことが発生しているため、注釈を付けたり、pom.xmlに依存関係を含めたりするだけで、非常に多くの機能が有効になる方法を理解するのが難しい場合があります。
この記事では、Spring Bootの魔法をわかりやすく説明して、舞台裏で何が起こっているかを確認します。 次に、これらの概念を使用して、独自のカスタムライブラリのスターターを作成します。
2. SpringBootの自動構成の謎を解き明かす
2.1. 自動構成クラス
Spring Bootが起動すると、クラスパスでspring.factoriesという名前のファイルが検索されます。 このファイルはMETA-INFディレクトリにあります。 このfile from the 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
このファイルは、Spring Bootが実行しようとするさまざまな構成クラスに名前をマップします。 したがって、このスニペットに従って、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ファイルで特定の名前で宣言します。 これらのプロパティは、Spring Bootコンテナによって自動的に取得されます。
それがどのように機能するか見てみましょう。
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の概念に基づいて、カスタムスターターを作成するには、次のコンポーネントを作成する必要があります。
-
ライブラリの自動構成クラスと、カスタム構成のプロパティクラス。
-
ライブラリと自動構成プロジェクトの依存関係を取り込むためのスターターpom。
デモンストレーションのために、構成パラメーターとして1日のさまざまな時刻のグリーティングメッセージを受け取り、グリーティングメッセージを出力するsimple greeting libraryを作成しました。 また、サンプルのSpring Bootアプリケーションを作成して、自動構成およびスターターモジュールの使用方法を示します。
3.1. 自動構成モジュール
自動構成モジュールをgreeter-spring-boot-autoconfigureと呼びます。 このモジュールには2つの主要なクラスがあります。 application.propertiesファイルを介してカスタムプロパティを設定できるようにするGreeterPropertiesと、greeterライブラリのBeanを作成するGreeterAutoConfiguartion。
両方のクラスのコードを見てみましょう。
@ConfigurationProperties(prefix = "example.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);
}
}
また、src/main/resources/META-INFディレクトリに次の内容のspring.factoriesファイルを追加する必要があります。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.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:と呼びます。
4.0.0
com.example
greeter-spring-boot-starter
0.0.1-SNAPSHOT
UTF-8
0.0.1-SNAPSHOT
1.5.2.RELEASE
org.springframework.boot
spring-boot-starter
${spring-boot.version}
com.example
greeter-spring-boot-autoconfigure
${project.version}
com.example
greeter
${greeter.version}
3.3. スターターの使用
スターターを使用するgreeter-spring-boot-sample-appを作成しましょう。 pom.xmlに、依存関係として追加する必要があります。
com.example
greeter-spring-boot-starter
${greeter-starter.version}
Spring Bootはすべてを自動的に構成し、GreeterBeanを注入して使用する準備が整います。
また、example.greeterプレフィックスを付けてapplication.propertiesファイルで定義することにより、GreeterPropertiesのデフォルト値のいくつかを変更しましょう。
example.greeter.userName=example
example.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スターターを展開し、これらのスターターと自動構成メカニズムがバックグラウンドでどのように動作して多くの手動構成を排除するかに焦点を当てました。
この記事で作成したすべてのモジュールの完全なソースコードは、over on GitHubにあります。