| この記事の要点 |
|---|
|
@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 / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38