プロジェクト

全般

プロフィール

操作

@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 プロジェクト)もご用意できます。お気軽にどうぞ。

渡邉 拓英 さんが1年以上前に更新 · 0件の履歴