Red Hat のソリューションアーキテクトの瀬戸です。
これはJakarta EE / Java EE Advent Calendar 2025の12日目の記事です。
この記事はQuarkusでのSpringアノテーションの使用を薦めるものではありません。適切にご使用ください。
と、最初に不穏な文章を書きましたが、Quarkusでは実はSpringのアノテーションや機能を一部、制限付きで使用する事ができます。
ただ、サポートされるものについてもSpringの全機能が使えるわけではありません。
例えばQuarkusのライブラリとしてquarkus-spring-diを追加する事で、SpringのDI系のアノテーションが有効になります。
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-spring-di</artifactId> </dependency>
これを使う事で @Autowired などのSpringでおなじみのアノテーションがQuarkusでも使用できるようになります。
つまり、次のようなコードもQuarkus上で動作します。Springのコードに見えるでしょう?
package org.acme.spring.di; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class GreeterBean { private final MessageProducer messageProducer; @Autowired @Qualifier("noopFunction") StringFunction noopStringFunction; @Autowired @Qualifier("capitalizeFunction") StringFunction capitalizerStringFunction; @Value("${greeting.suffix:!}") String suffix; public GreeterBean(MessageProducer messageProducer) { this.messageProducer = messageProducer; } public String greet(String name) { final String initialValue = messageProducer.getPrefix() + " " + name + suffix; return noopStringFunction.andThen(capitalizerStringFunction).apply(initialValue); } }
しかし、内部でSpringのDIコンテナが動くわけではなく、QuarkusのCDI上で動きます。SpringもQuarkusもDIコンテナではあるので、大きな問題になることはないとは少ないと思いますが、 ApplicationContext や BeanPostProcessor などは動作せず、Spring AOPについても動作しないため、すべてにおいて完全な互換性が必要な場合には不適なものとなっています。
また、実行時DIではなく、ビルド時DIとなるので、実行時にDIを使っていろいろなことをやってる場合も多くの場合に動作しません。
実際にquarkus-spring-diの依存関係を確認したところ、QuarkusのDI実装であるarcにのみ依存が張られており、Spring本体への依存はありませんでした。
>mvn dependency:tree [INFO] Scanning for projects... [INFO] [INFO] -------------------< org.acme:spring-di-quickstart >-------------------- [INFO] Building spring-di-quickstart 1.0.0-SNAPSHOT [INFO] from pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- dependency:3.7.0:tree (default-cli) @ spring-di-quickstart --- [INFO] org.acme:spring-di-quickstart:jar:1.0.0-SNAPSHOT [INFO] +- io.quarkus:quarkus-spring-di:jar:3.30.2:compile [INFO] | +- io.quarkus:quarkus-spring-core-api:jar:6.2.SP1:compile [INFO] | +- io.quarkus:quarkus-spring-context-api:jar:6.2.SP1:compile [INFO] | +- io.quarkus:quarkus-spring-beans-api:jar:6.2.SP1:compile [INFO] | \- io.quarkus:quarkus-arc:jar:3.30.2:compile [INFO] | +- io.quarkus.arc:arc:jar:3.30.2:compile [INFO] | | +- jakarta.transaction:jakarta.transaction-api:jar:2.0.1:compile [INFO] | | \- io.smallrye.reactive:mutiny:jar:3.0.3:compile [INFO] | | \- org.jctools:jctools-core:jar:4.0.5:compile [INFO] | \- org.eclipse.microprofile.context-propagation:microprofile-context-propagation-api:jar:1.3:compile (以下省略)
SpringでのAOP的な何かを追加したい場合はCDIの仕組みを使う必要がありますのでご注意ください。 後ろ側で共通機能とかを作る人はCDIの拡張ポイントでがんばれ。
また、この記事ではspring-diの説明をしましたが、Spring Web、Data JPAなど、いくつかのアノテーションや機能の一部を使用することができます。興味がある方は次のURLからご確認ください。。