@Autowired new 違い¶
@Autowired と new の違いは、主に 依存性注入(DI: Dependency Injection) を使うか、自分でオブジェクトを生成するか、という点にあります。
🔧 new を使う場合¶
MyService service = new MyService();
特徴:¶
- 明示的にインスタンスを生成している。
- コンストラクタの依存関係(引数)も自分で解決する必要がある。
- Spring の管理対象外(Bean ではない)。
デメリット:¶
- テストがしにくい(モックを差し替えにくい)。
- クラス同士の結びつきが強くなる(疎結合ではない)。
- 複雑な依存関係がある場合、管理が難しくなる。
✅ @Autowired を使う場合(Spring の依存性注入)¶
@Component
public class MyComponent {
@Autowired
private MyService myService;
// もしくはコンストラクタで注入
@Autowired
public MyComponent(MyService myService) {
this.myService = myService;
}
}
特徴:¶
- Spring が自動的に依存する Bean(MyService)を注入してくれる。
- Spring コンテナが管理する Bean に対して有効。
- 疎結合でテストしやすい(モックと差し替え可能)。
メリット:¶
- 再利用性・保守性が高くなる。
- DI コンテナがライフサイクルを管理してくれる。
- 複雑な依存関係でも簡潔に記述できる。
❗ 補足¶
-
@Autowiredを使うには、対象クラスが Spring 管理対象(例:@Component,@Service,@Repositoryなど)である必要があります。 -
newを使うと、そのクラスは Spring が管理していないため、@Autowiredで注入されるような Bean の恩恵(AOP、トランザクション管理など)を受けられません。
まとめ¶
new |
@Autowired |
|
|---|---|---|
| 誰が生成? | 自分で生成 (new) |
Spring が生成 |
| ライフサイクル | 自分で管理 | Spring が管理 |
| テストしやすさ | 難しい | モック注入が簡単 |
| 結合度 | 高い(密結合) | 低い(疎結合) |
| Spring機能の恩恵 | 受けられない | AOP・トランザクションなどの機能が使える |
必要であれば、どんなケースで new を使ってしまいがちか、@Autowired を使う際の注意点なども詳しく解説できます。
@Autowired は、Spring Framework で使われる 依存性注入(Dependency Injection, DI) を行うためのアノテーションです。Spring が自動でオブジェクトをインジェクション(注入)してくれるので、コードの再利用性・保守性が高まります。
🌱 @Autowired の概要¶
- 目的: 他のクラスのインスタンス(Bean)を自動的に注入して使えるようにする。
- 対象: フィールド・コンストラクタ・セッター・メソッド に付けられる。
-
前提: 対象のクラスは Spring 管理対象(
@Componentや@Serviceなど)である必要があります。
✅ よく使う使い方¶
1. フィールド注入(非推奨) ¶
@Component
public class MyController {
@Autowired
private MyService myService;
public void doSomething() {
myService.process();
}
}
- 簡単だけどテストしにくいため、最近はあまり推奨されていません。
2. コンストラクタ注入(推奨) ¶
@Component
public class MyController {
private final MyService myService;
@Autowired
public MyController(MyService myService) {
this.myService = myService;
}
public void doSomething() {
myService.process();
}
}
- 不変性・テストのしやすさの面で、最も推奨される方法。
- Spring 4.3 以降、コンストラクタが1つだけなら
@Autowiredは省略可能。
3. セッター注入 ¶
@Component
public class MyController {
private MyService myService;
@Autowired
public void setMyService(MyService myService) {
this.myService = myService;
}
public void doSomething() {
myService.process();
}
}
- 可変性が必要な場合に使われる。
🔁 処理のイメージ(図解風)¶
起動時: Spring Boot アプリ起動
↓
Spring が @Component や @Service をスキャン
↓
MyService のインスタンスを作成して管理
↓
MyController に @Autowired を発見
↓
MyController の myService に MyService のインスタンスを注入
↓
MyController が完成された状態で使用可能に
🧠 補足知識¶
対象の Bean が見つからないと?¶
- デフォルトでは、Bean が見つからないと例外が発生します。
- 回避するには
@Autowired(required = false)を使うこともできます。
@Autowired(required = false)
private Optional<MyService> myService;
同じ型の Bean が複数あると?¶
-
Spring はどれを注入すべきか迷うため、エラーになります。
-
対処法:
-
@Qualifier("beanName")で明示 -
@Primaryで優先指定
-
✅ まとめ¶
| 項目 | 内容 |
|---|---|
| 主な用途 | 依存する Bean を自動的に注入する |
| 使用場所 | フィールド、コンストラクタ、セッター |
| 推奨方法 | コンストラクタ注入(テスト・保守性に優れる) |
| 処理タイミング | Spring 起動時に DI コンテナが解決 |
| 使うための条件 | 対象クラスが Spring 管理 Bean であること |
必要であれば、@Autowired の挙動確認用の簡単なサンプルコード(Spring Boot プロジェクト)もご用意できます。お気軽にどうぞ。