| この記事の要点 |
|---|
|
@Autowired とは
Spring コンテナに登録された Bean を、型を一致させて自動的に注入するアノテーションです。DI(依存性の注入)の中核機能。
3 種類の注入方法
① コンストラクタ注入(推奨)
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired // Spring 4.3+ なら省略可(コンストラクタが 1 つの場合)
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
// Lombok を使うとさらに簡潔
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository; // 自動でコンストラクタ生成
}
メリット:
- 不変 (final) フィールドにできる → スレッドセーフ
- テスト時にモックを渡しやすい(new でインスタンス化可能)
- 必須依存が明確
- 循環依存を検出(起動時に
BeanCurrentlyInCreationException)
② フィールド注入(非推奨)
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
}
デメリット:
finalにできない(再代入可能)- テスト時にリフレクションが必要(または
@InjectMocksなど Mockito 機能) - 循環依存に気づきにくい(起動するが実行時に NPE)
③ セッター注入
@Service
public class UserService {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
用途: 任意の依存(@Autowired(required = false))を表現したい時。
同型 Bean が複数ある場合
同じインタフェースを実装した Bean が複数登録されていると、Spring はどれを注入すべきか判断できず例外が発生:
// 複数の Bean
@Service("emailNotifier")
public class EmailNotifier implements Notifier { ... }
@Service("smsNotifier")
public class SmsNotifier implements Notifier { ... }
// 単純な @Autowired は失敗
@Service
public class OrderService {
@Autowired
private Notifier notifier;
// → NoUniqueBeanDefinitionException
}
解決策 1: @Qualifier で名前指定
@Service
public class OrderService {
private final Notifier notifier;
public OrderService(@Qualifier("emailNotifier") Notifier notifier) {
this.notifier = notifier;
}
}
解決策 2: @Primary で優先 Bean を指定
@Service
@Primary
public class EmailNotifier implements Notifier { ... }
// 以後、Notifier 型の注入は EmailNotifier が選ばれる
解決策 3: 全部受け取って自分で選ぶ
@Service
public class OrderService {
private final List<Notifier> notifiers; // 全 Bean を List で受け取る
public OrderService(List<Notifier> notifiers) {
this.notifiers = notifiers;
}
}
// または Map (key = Bean 名)
public OrderService(Map<String, Notifier> notifierMap) { ... }
@Autowired(required = false)
Bean が存在しない場合でもエラーにせず、null のままにしたい時:
@Service
public class OrderService {
@Autowired(required = false)
private OptionalFeature optionalFeature; // 存在しなくても OK
}
// Spring 5+ なら Optional<T> でも同じ効果
@Service
public class OrderService {
private final Optional<OptionalFeature> optionalFeature;
public OrderService(Optional<OptionalFeature> feature) { ... }
}
循環依存(Circular Dependency)
@Service
public class ServiceA {
private final ServiceB b;
public ServiceA(ServiceB b) { this.b = b; }
}
@Service
public class ServiceB {
private final ServiceA a;
public ServiceB(ServiceA a) { this.a = a; }
}
// → BeanCurrentlyInCreationException
対処:
- 設計を見直す: 共通ロジックを ServiceC に切り出し
- @Lazy で遅延注入:
@Lazy private ServiceB b; - セッター注入に変更: 起動時には注入せず、後から設定
- ApplicationContext から手動取得:
context.getBean(ServiceB.class)(最終手段)
よくあるトラブル
Q. NoSuchBeanDefinitionException
Bean が登録されていない。原因:
- クラスに
@Component/@Service等が付いていない - パッケージが
@ComponentScanの範囲外 @Configurationで@Beanの定義が漏れている- interface を実装した具象クラスがない
Q. private フィールドの @Autowired が null
newでインスタンス化している(Spring 経由でないと注入されない)- クラス自体が Bean として登録されていない
- 非 Spring 管理オブジェクトから呼ばれている(リスナー・スレッド等)
関連記事
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09