ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|---|
|
@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 notifiers; // 全 Bean を List で受け取る
public OrderService(List notifiers) {
this.notifiers = notifiers;
}
}
// または Map (key = Bean 名)
public OrderService(Map notifierMap) { ... }
@Autowired(required = false)
Bean が存在しない場合でもエラーにせず、null のままにしたい時:
@Service
public class OrderService {
@Autowired(required = false)
private OptionalFeature optionalFeature; // 存在しなくても OK
}
// Spring 5+ なら Optional でも同じ効果
@Service
public class OrderService {
private final Optional optionalFeature;
public OrderService(Optional 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=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Laravel キャッシュクリア完全ガイド(cache:clear / config:clear / 2026-05-18 07:42:07
- プロジェクトの作成と削除 2026-05-18 07:42:07
- インストール直後にNetbeansが反応しない 2026-05-18 07:42:07
- 動画やチャンネルの検索 2026-05-18 07:42:07
- APIキー取得方法 2026-05-18 07:42:07
- チャンネル情報の取得 2026-05-18 07:42:07
- API 入門 — Web API(REST / GraphQL / gRPC / 2026-05-18 07:42:07
- インストール(eclipseプラグイン) 2026-05-18 07:42:07
- Laravel「Dotenv values containing spaces must be surrounded 2026-05-18 07:42:07
- エラー一覧 2026-05-18 07:42:07
- curl: (51) SSL: certificate subject name '~' does not match 2026-05-18 07:42:07
- インストール方法(Windows版) 2026-05-18 07:42:07
- JSONから配列に変換 2026-05-18 07:42:07
- 処理を一定時間待つ 2026-05-18 07:42:07
- A non well formed numeric value encountered 2026-05-18 07:42:07
コメントを削除してもよろしいでしょうか?