【Spring Boot】Autowiredを使用せずにBeanを取得する方法(contextを使用)
1. 今回ご説明すること
Spring Boot を使用したプログラムを記述する際に、
業務コンポーネントなどに以下のアノテーションを付与するケースがあると思います。
1 2 |
@Component @Service |
このようなアノテーションを付与したクラスを使用する際は、
通常、以下のアノテーションを付与して使用します。
1 |
@Autowired |
しかし、場合によっては、これを使用せずに、リフレクションのような形でこれらのクラスを呼び出したケースがあります。
今回は、このケースにおける実装を紹介します。
2. 具体的なケースと解決策
今回、特定のクラスを継承したクラスを列挙して、for文で処理を実施したいケースがありました。
具体的には以下のようなイメージです。
本記事の解答となるソースコードと共に以下に記述します。
※ Kotlinで記述しているのでJavaユーザーの方は読み替えをお願い致します。
※下記で出現する toLowerCamelCase() メソッドで小職が実装した独自メソッドです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
import org.springframework.beans.factory.annotation.Autowired import org.springframework.context.ApplicationContext import org.springframework.scheduling.annotation.Scheduled import org.springframework.stereotype.Component import java.io.PrintWriter import java.io.StringWriter import kotlin.reflect.KClass (重要でないためその他のimportの記載は省略) : : @Component class Sample { // Beanを取得するためのContextクラスを使用します @Autowired lateinit var context: ApplicationContext /** * Bean */ fun update() { // 処理対象のクラスを全て取得してインスタンスをContextから取得します. // その後基底クラスで宣言されている scan() メソッドを実行します. for (clazz in getSearcherClasses()) { val result: Result<Unit?> = runCatching { val instance = context.getBean(clazz.simpleName!!.toLowerCamelCase()) as ISearcher instance.scan() } if (result.isFailure) { // 必要に応じてエラーハンドリングを実施する } } } /** * 処理対象のクラスを全て取得します. */ private fun getSearcherClasses(): MutableList<KClass<out ISearcher>> { val classes = mutableListOf<KClass<out ISearcher>>() classes.add(AAA::class) classes.add(BBB::class) classes.add(CCC::class) (以下記載を省略) : : : return classes } } |
3. まとめ
今回は、ソースコードメインの短い記事でしたが、参考になったら幸いです。
誤りなどがあればご指摘いただけますと幸いです。
また、こんなことも解説して欲しい、ということがありましたらお問い合わせからご連絡をお願い致します。