Spring Bootのアノテーションとインタフェースの関係をやさしく解説!

こんにちは。ゆうせいです。

Javaを使って本格的なWebアプリケーションを開発しようとすると、必ず出てくるのがSpring Boot(スプリング・ブート)です。

そしてその中でよく登場するのが、「アノテーション」と「インタフェース」。

この2つの関係って、最初はちょっと分かりづらいんですよね。でも安心してください!

今回は、Spring Bootのアノテーションが何のために使われていて、インタフェースとどう関係しているのかを、高校生でもわかるように例えを交えて説明していきます。


アノテーションってそもそもなに?

アノテーション=「Javaへの指示書」

アノテーションとは、Javaのクラスやメソッド、フィールドなどに「これは特別な意味があるよ」とメタ情報を付けるための仕組みです。

たとえば、Spring Bootではこんなアノテーションがよく出てきます。

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String sayHello() {
        return "Hello!";
    }
}

これは、「このクラスはWebのリクエストを受け取るコントローラーですよ」とSpringに伝えるための「しるし」です。

イメージで言えば、宅配便の荷物に貼るラベルのようなもの。
中身(クラスやメソッド)は変わらなくても、貼るラベル(アノテーション)によって扱い方が変わるんです。


Spring Bootでよく使うアノテーションとその意味

アノテーション意味
@ComponentこのクラスはSpringが管理すべき部品(コンポーネント)です
@Serviceサービス層のロジックを持つクラスです(@Componentの一種)
@Repositoryデータアクセス層(DAO)のクラスです
@Controller / @RestControllerWebのリクエストを受け取るクラスです
@AutowiredSpringに「ここに依存するものを注入して!」とお願いする

インタフェースとの関係を図で理解!

Spring Bootでは、「インタフェース」と「アノテーション」が一緒に使われる場面がたくさんあります。

たとえば、次のようなコードを見てみましょう。

public interface GreetingService {
    String greet(String name);
}

@Service
public class GreetingServiceImpl implements GreetingService {
    public String greet(String name) {
        return "Hello, " + name;
    }
}

@RestController
public class HelloController {

    private final GreetingService greetingService;

    // コンストラクタで依存性注入
    public HelloController(GreetingService greetingService) {
        this.greetingService = greetingService;
    }

    @GetMapping("/greet")
    public String greet() {
        return greetingService.greet("Spring Boot");
    }
}

このコードで起きていることを整理!

  1. GreetingServiceインタフェースです。つまり「仕様書」。
  2. GreetingServiceImplはそのインタフェースを実装した「中身」。
  3. @Serviceというアノテーションを付けることで、Springが自動的に管理対象(DIコンテナに登録)にします。
  4. HelloControllerはそのインタフェースを依存性注入によって受け取ります。

つまりどういう関係?

Spring Bootの中では、以下のような連携が成り立っています。

[インタフェース] ←→ [@Serviceなどで管理された実装クラス]
       ↑
       |
[コントローラーが依存性注入を受ける]
  • アノテーションはSpringに「これ使って」と指示するもの
  • インタフェースは「どんな機能を持ってるか」の約束
  • Springはこの約束に従って、実装クラスを自動的に注入する

例えでイメージ!

「インタフェース=職業名」、「実装クラス=実際の人」、「アノテーション=社員証」

たとえば会社で「エンジニア募集」と書いたポスターがあったとします。
それがインタフェースです。仕様や期待される能力を表しています。

そこに「私はJavaが書けるエンジニアです!」と書いた社員が応募してきます。
それが実装クラスです。

Springは「この人はエンジニア(インタフェース)を満たしてるね」と判断し、@Serviceという社員証があるから採用して、社内で使えるようにしてくれるわけです。


よくある疑問

Q. なぜインタフェースを使うの? 直接クラスでよくない?

A. インタフェースを使うことで、実装の差し替えがカンタンになるからです。たとえば将来的に別のGreetingServiceを作ってテスト用に切り替えるのもラクです。

Q. @Autowiredはどこに使うのが正しい?

A. 現在はコンストラクタインジェクション(今回のような形式)が推奨されています。昔はフィールドに@Autowiredを直接付ける方法もよく使われていました。


今後の学習の道しるべ

次のステップとして、以下の内容に進んでみましょう。

  • SpringのDIコンテナの仕組み(ApplicationContext)
  • Beanのスコープ(singletonやprototypeなど)
  • インタフェースを使ったモックの作り方(テスト技法)
  • Spring AOP(アスペクト指向)とアノテーションの関係

Spring Bootの魅力は、アノテーションで簡潔に強力な機能を使えることにあります。慣れてくると設計の幅がぐっと広がりますよ。

引き続き、一緒に頑張っていきましょう!


セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。