私には3つのクラスがあります:
open class RedirectProcessor(
private val adProcessor: AdProcessor
) {
fun run(depth: Int): String =
if (depth < 3) adProcessor.run(depth + 1) else "redirect"
}
open class FallbackProcessor(
private val adProcessor: AdProcessor
) {
fun run(depth: Int): String =
if (depth < 3) adProcessor.run(depth + 1) else "fallback"
}
open class AdProcessor(
private val redirectProcessor: RedirectProcessor,
private val fallbackProcessor: FallbackProcessor
) {
fun run(depth: Int): String =
depth.toString() +
redirectProcessor.run(depth) +
fallbackProcessor.run(depth)
}
だから、彼らはお互いに依存しています。私はSpringコンテキストを以下のように構成しようとしています:
@Configuration
class Config {
@Bean
@Lazy
fun redirectProcessor(): RedirectProcessor = RedirectProcessor(adProcessor())
@Bean
@Lazy
fun fallbackProcessor(): FallbackProcessor = FallbackProcessor(adProcessor())
@Bean
fun adProcessor() = AdProcessor(
redirectProcessor = redirectProcessor(),
fallbackProcessor = fallbackProcessor()
)
}
@Lazyアノテーションを使用する必要があることはわかっていました。サービスを@Componentアノテーションでマークし、コンストラクターで@Lazyを使用すると、正常に機能します。しかし、@ Beanアノテーションを使用してBeanを定義する必要があり、問題が発生します。それを解決する方法はありますか?
回答 2 件
私は同じ問題に遭遇しました、そして
@Autowire
なんらかの理由で注釈が機能しません。そこで、別の回避策を使用しました。
注入する
ApplicationContext
Bean自体の代わりにBeanインスタンスを取得するには
ApplicationContext
次のようなコード:
class ServiceA( private val serviceB: ServiceB ) { ...... } class ServiceB( private val applicationContext: ApplicationContext ) { private val serviceA: ServiceA by lazy { // we need this logic for only once // so "property delegated by lazy ..." is perfect for this purpose applicationContext.getBean(ServiceA::class.java) } ...... }
関連記事
- DAX:USERELATIONSHIPを使用し、循環依存が検出されたエラーを取得する
- サービスが相互に呼び出すときに、タイプスクリプトの循環依存関係が検出されました
- spring oauth2(ssoアプリケーション)でインターセプターとビジネスレイヤー間でユーザーコンテキストを共有する
- 多くの依存コンポーネントを持つシステムのパターンにおける循環依存
- 複数のhttpセクションでSpring Securityコンテキストを共有する
- セキュリティスプリングの依存関係を追加したときにTomcatが機能しないのはなぜですか?
- 私のスプリングブートプロジェクトで依存関係ではないクラスを使用する方法
- ionic:循環依存性であり、すべてのパラメーターを解決できない
- Spring MVC 4のサーブレットに依存関係を注入する方法は?
関連した質問
- Swaggerモデルからエンティティを除外する
- DTO、エンティティを使用してSpring Bootを作成しましたが、保存できません
- コントローラで@AsyncとCompletableFutureを使用すると、APIのパフォーマンスを向上させることができますか?
- ストリーミングをサポートするByteBufferを実装する
- Cloud Native Buildpacks/Paketo with Java/Spring Boot:さまざまなJDKダウンロードuriを構成する方法(例:githubcomへのアクセスなし)
- Spring RESTfulWebサービスの問題
- Javaでアノテーションバンドル(つまり、他のアノテーションを適用するアノテーション)を作成することは可能ですか?
- SpringでKeycloakトークンを取得する方法
- Android(Kotlin):オブザーバーのタイプの不一致
Kotlinについては言えませんが(kotlinに関する私の知識は現時点ではかなり限られています)、Javaでは最後に利用可能なSpringバージョン(5.2.6.RELEASE)があります。
私はあなたの例の次の「kotlinからjava」への翻訳でそれを動作させました:
次に、別の方法で構成を使用するのがコツでした(ただし、Java構成ルールの観点からは完全に「正当な」方法です)。
の使用法に注意してください
@Lazy
Bean自体ではなく、パラメータのアノテーション。リスナーはテスト目的でのみ実行されます。アプリケーションを実行すると、
23redirectfallback3redirectfallback
なぜそれが機能するのですか?
春がそのようなものを見たとき
@Lazy
注釈付きパラメーター-パラメータークラスからランタイム生成プロキシ(CGLIBを使用)を作成します。このプロキシは、Beanをラップするように機能し、このBeanは、初めて「必須」になったときにのみ完全に作成されます(この場合、このBeanのメソッドを呼び出します)。
で作業する場合
@Component
次の宣言と同じです。片方のメモ、私は入れていません
@Autowired
のコンストラクターについてFallbackProcessor
最後の例のクラスは、コンストラクターが1つしかない場合にのみ、Springが「それを認識」し、それを使用してすべての依存関係を挿入するためです。次のチュートリアルとSOのこのやや古いスレッドも関連している可能性があります(読む価値があります)。