springで@Import
されるjava configクラスを作成していた。このとき、その設定クラスは@Configuration
を付けなくても@Import
すればクラス内の@Bean
が登録されるのが、なんか不思議だったのでその辺を勉強するべくソースコードを見てみた。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
ソースを追ってみると、ApplicationContextの細かいところは省くが、@Import
の処理をしているのはこの辺らしい。以下のメソッドではimport候補クラスのコレクションを渡されて、それを一つずつ処理している。
package org.springframework.context.annotation;
class ConfigurationClassParser {
private void processImports(/*...(略)...*/, Collection<SourceClass> importCandidates, /*...(略)...*/) {
// ...(略)
for (SourceClass candidate : importCandidates) {
if (candidate.isAssignable(ImportSelector.class)) {
// ...(略)
else if (candidate.isAssignable(ImportBeanDefinitionRegistrar.class)) {
// ...(略)
else {
// Candidate class not an ImportSelector or ImportBeanDefinitionRegistrar ->
// process it as an @Configuration class
this.importStack.registerImport(
currentSourceClass.getMetadata(), candidate.getMetadata().getClassName());
processConfigurationClass(candidate.asConfigClass(configClass));
このとき、条件付きimportをする@ImportSelector
と@ImportBeanDefinitionRegistrar
が付与されていれば、それ専用の処理が行われる。しかし、それらアノテーションではない場合、コード内のコメントにあるように「import候補クラスがImportSelectorないしImportBeanDefinitionRegistrarでは無い場合は@Configuration
扱いで処理する」となる。
なので、@Import
対象クラスは@Configuration
と見なされる、と考えても基本的には良さそうである。もちろん細かくは色々違いはあるだろうけど。