Spring Bootアノテーション完全ガイド|よく使う注釈を分かりやすく解説

Spring Bootでアプリケーション開発をしていると、コードのあちこちに「@」から始まる記号が登場しますよね。

@SpringBootApplication@RestController@Autowired…初めて見た時は「これ、何?」と戸惑った方も多いのではないでしょうか。

これらはアノテーション(注釈)と呼ばれるもので、Spring Bootの強力な機能を簡単に使うための目印なんです。

この記事では、Spring Bootでよく使うアノテーションを、初心者の方にも分かるように丁寧に解説していきます。実例を交えながら見ていきましょう!


スポンサーリンク

アノテーションとは?基本を理解しよう

「@」記号の正体

アノテーションとは、Javaのコードに付ける「メタデータ(データについての情報)」のこと。

日本語では「注釈」と訳されます。「@」記号から始まり、クラスやメソッド、フィールドの上に記述します。

@RestController
public class HelloController {
    // クラスの内容
}

この@RestControllerというアノテーションが、「このクラスはRESTコントローラーですよ」という情報を伝えているんですね。

アノテーションの役割

Spring Bootでは、アノテーションが以下のような重要な役割を果たします。

主な役割:

  • 設定の簡略化:XMLファイルなしで設定を記述できる
  • 自動設定のトリガー:Spring Bootが自動的に必要な処理を行う
  • 依存性注入(DI):必要なオブジェクトを自動的に渡してもらえる
  • コードの意図を明確化:何のためのクラスかが一目で分かる

従来のSpring Frameworkでは、複雑なXMLファイルで設定していました。

アノテーションのおかげで、コードがシンプルで読みやすくなったんです。


Spring Boot起動に関するアノテーション

まずは、Spring Bootアプリケーションの起動に必要なアノテーションから見ていきましょう。

@SpringBootApplication

最も重要なアノテーション。これがSpring Bootアプリケーションの起点になります。

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

何をしているのか:

実は、この1つのアノテーションは、以下の3つを組み合わせたものなんです。

  • @Configuration:このクラスが設定クラスであることを示す
  • @EnableAutoConfiguration:Spring Bootの自動設定を有効化
  • @ComponentScan:同じパッケージ内のコンポーネントを自動検出

つまり、たった1行で、Spring Bootに必要な基本設定がすべて完了するわけですね。

@EnableAutoConfiguration

Spring Bootの「自動設定」機能を有効にするアノテーション。

通常は@SpringBootApplicationに含まれているので、単独で使うことは少ないです。

@ComponentScan

指定したパッケージ配下のコンポーネント(@Componentなどが付いたクラス)を自動的にスキャンします。

@ComponentScan(basePackages = "com.example.myapp")

デフォルトでは、アノテーションを付けたクラスと同じパッケージ以下をスキャンします。


コンポーネント定義のアノテーション

Spring Bootでは、クラスの役割を示すためのアノテーションがいくつか用意されています。

@Component

最も基本的なコンポーネント定義アノテーション。

@Component
public class MyComponent {
    // 汎用的なコンポーネント
}

Spring Bootがこのクラスを管理対象として認識し、必要に応じて自動的にインスタンスを作成してくれます。

@Controller

Webアプリケーションのコントローラークラスに付けるアノテーション。

@Controller
public class WebController {

    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("message", "Hello World");
        return "hello"; // ビュー名を返す
    }
}

主に、HTMLページを返す伝統的なMVCパターンで使われます。

@RestController

RESTful APIを作る際に使うアノテーション。

@RestController
public class ApiController {

    @GetMapping("/api/hello")
    public String hello() {
        return "Hello World"; // JSON形式で返される
    }
}

@Controllerとの違い:

@RestControllerは、@Controller@ResponseBodyを組み合わせたもの。

すべてのメソッドの戻り値が自動的にJSON形式に変換されて返されます。

REST APIを作る場合は、こちらを使うのが一般的です。

@Service

ビジネスロジックを担当するサービスクラスに付けるアノテーション。

@Service
public class UserService {

    public User findUserById(Long id) {
        // ユーザー検索のロジック
        return user;
    }
}

機能的には@Componentと同じですが、「これはサービス層ですよ」と意図を明確にする役割があります。

@Repository

データベースアクセスを担当するリポジトリクラスに付けるアノテーション。

@Repository
public class UserRepository {

    public User save(User user) {
        // データベース保存処理
        return user;
    }
}

特別な機能:

データベース関連の例外を、SpringのDataAccessExceptionに自動変換してくれます。


依存性注入(DI)のアノテーション

Spring Bootの中核機能である依存性注入(Dependency Injection)に関するアノテーションです。

@Autowired

必要なオブジェクトを自動的に注入(渡してもらう)するアノテーション。

フィールド注入:

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    // userServiceを使ったメソッド
}

コンストラクタ注入(推奨):

@RestController
public class UserController {

    private final UserService userService;

    @Autowired  // Spring 4.3以降は省略可能
    public UserController(UserService userService) {
        this.userService = userService;
    }
}

現代の開発では、コンストラクタ注入が推奨されています。テストしやすく、不変性も保てるためです。

@Qualifier

同じ型のBeanが複数ある場合、どれを注入するか指定するアノテーション。

@Service
@Qualifier("emailService")
public class EmailNotificationService implements NotificationService {
    // 実装
}

@RestController
public class NotificationController {

    private final NotificationService notificationService;

    @Autowired
    public NotificationController(@Qualifier("emailService") NotificationService service) {
        this.notificationService = service;
    }
}

@Primary

同じ型のBeanが複数ある場合、優先的に注入されるものを指定します。

@Service
@Primary
public class EmailNotificationService implements NotificationService {
    // このServiceが優先的に注入される
}

リクエストマッピングのアノテーション

HTTPリクエストとメソッドを紐付けるアノテーションです。

@RequestMapping

最も汎用的なマッピングアノテーション。

@RestController
@RequestMapping("/api/users")
public class UserController {

    @RequestMapping(method = RequestMethod.GET)
    public List<User> getAllUsers() {
        return userList;
    }
}

クラスレベルに付けると、そのクラス内のすべてのメソッドに共通のパスプレフィックスが付きます。

@GetMapping

GETリクエスト専用のショートカット。

@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
    return userService.findById(id);
}

@RequestMapping(method = RequestMethod.GET)と同じ意味ですが、こちらの方が簡潔です。

@PostMapping

POSTリクエスト専用。主に新規作成に使います。

@PostMapping("/users")
public User createUser(@RequestBody User user) {
    return userService.save(user);
}

@PutMapping

PUTリクエスト専用。主に更新に使います。

@PutMapping("/users/{id}")
public User updateUser(@PathVariable Long id, @RequestBody User user) {
    return userService.update(id, user);
}

@DeleteMapping

DELETEリクエスト専用。削除に使います。

@DeleteMapping("/users/{id}")
public void deleteUser(@PathVariable Long id) {
    userService.delete(id);
}

@PatchMapping

PATCHリクエスト専用。部分的な更新に使います。

@PatchMapping("/users/{id}")
public User partialUpdate(@PathVariable Long id, @RequestBody Map<String, Object> updates) {
    return userService.partialUpdate(id, updates);
}

リクエストパラメータ関連のアノテーション

HTTPリクエストのデータを受け取るためのアノテーションです。

@PathVariable

URLパスの一部を変数として受け取る。

@GetMapping("/users/{userId}/posts/{postId}")
public Post getPost(@PathVariable Long userId, @PathVariable Long postId) {
    return postService.findPost(userId, postId);
}

/users/123/posts/456というURLなら、userIdに123、postIdに456が入ります。

@RequestParam

クエリパラメータを受け取る。

@GetMapping("/search")
public List<User> searchUsers(
    @RequestParam String keyword,
    @RequestParam(defaultValue = "0") int page,
    @RequestParam(required = false) String sort
) {
    return userService.search(keyword, page, sort);
}

/search?keyword=spring&page=1&sort=nameのようなURLに対応します。

@RequestBody

リクエストボディのJSONをJavaオブジェクトに変換する。

@PostMapping("/users")
public User createUser(@RequestBody User user) {
    // JSONで送られてきたデータがUserオブジェクトに変換される
    return userService.save(user);
}

@RequestHeader

HTTPヘッダーの値を受け取る。

@GetMapping("/info")
public String getInfo(@RequestHeader("User-Agent") String userAgent) {
    return "Your browser: " + userAgent;
}

バリデーション関連のアノテーション

入力値の検証に使うアノテーションです。

@Valid

オブジェクトの検証を有効にする。

@PostMapping("/users")
public User createUser(@Valid @RequestBody User user) {
    return userService.save(user);
}

@NotNull / @NotEmpty / @NotBlank

Beanバリデーションのアノテーション。

public class User {

    @NotNull(message = "IDは必須です")
    private Long id;

    @NotEmpty(message = "名前は空にできません")
    private String name;

    @NotBlank(message = "メールアドレスを入力してください")
    @Email(message = "正しいメールアドレスを入力してください")
    private String email;

    @Min(value = 0, message = "年齢は0以上である必要があります")
    @Max(value = 150, message = "年齢は150以下である必要があります")
    private Integer age;
}

違い:

  • @NotNull:nullでなければOK(空文字はOK)
  • @NotEmpty:nullでも空でもダメ(空白文字だけはOK)
  • @NotBlank:nullでも空でも空白だけでもダメ

データベース関連のアノテーション

JPAを使ったデータベース操作に関するアノテーションです。

@Entity

データベーステーブルに対応するエンティティクラスに付ける。

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, length = 100)
    private String name;

    @Column(unique = true)
    private String email;
}

@Id

主キーを示す。

@GeneratedValue

主キーの自動生成戦略を指定します。

@Column

カラムの詳細設定を行う。

@OneToMany / @ManyToOne / @ManyToMany

テーブル間の関連を定義する。

@Entity
public class User {
    @Id
    private Long id;

    @OneToMany(mappedBy = "user")
    private List<Post> posts;
}

@Entity
public class Post {
    @Id
    private Long id;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}

設定とBean定義のアノテーション

@Configuration

設定クラスであることを示す。

@Configuration
public class AppConfig {

    @Bean
    public DataSource dataSource() {
        // DataSourceの設定
        return dataSource;
    }
}

@Bean

メソッドの戻り値をSpringのBeanとして登録する。

@Value

プロパティファイルの値を注入する。

@Component
public class AppProperties {

    @Value("${app.name}")
    private String appName;

    @Value("${app.version:1.0}")  // デフォルト値を指定
    private String appVersion;
}

application.propertiesapplication.ymlの値を読み込めます。

@ConfigurationProperties

複数のプロパティをまとめて管理する。

@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {

    private String name;
    private String version;
    private int timeout;

    // getter/setter
}

application.ymlの設定例:

app:
  name: MyApp
  version: 1.0.0
  timeout: 3000

その他の便利なアノテーション

@Transactional

トランザクション管理を自動化する。

@Service
public class UserService {

    @Transactional
    public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
        // この処理はトランザクション内で実行される
        // エラーが起きたら自動的にロールバック
        accountRepository.withdraw(fromId, amount);
        accountRepository.deposit(toId, amount);
    }
}

@Scheduled

定期実行タスクを設定する。

@Component
public class ScheduledTasks {

    @Scheduled(fixedRate = 5000)  // 5秒ごと
    public void reportCurrentTime() {
        System.out.println("現在時刻: " + new Date());
    }

    @Scheduled(cron = "0 0 1 * * ?")  // 毎日午前1時
    public void cleanupOldData() {
        // 古いデータの削除処理
    }
}

@Async

非同期処理を実現する。

@Service
public class EmailService {

    @Async
    public void sendEmail(String to, String subject, String body) {
        // この処理は別スレッドで非同期に実行される
        // メソッドを呼び出したスレッドはブロックされない
    }
}

@Profile

環境ごとに異なる設定を使い分ける。

@Configuration
@Profile("development")
public class DevConfig {
    // 開発環境用の設定
}

@Configuration
@Profile("production")
public class ProdConfig {
    // 本番環境用の設定
}

アノテーションの組み合わせ例

実際のアプリケーションでは、複数のアノテーションを組み合わせて使います。

REST APIの完全な例

@RestController
@RequestMapping("/api/users")
@RequiredArgsConstructor  // Lombokアノテーション
public class UserController {

    private final UserService userService;

    @GetMapping
    public List<User> getAllUsers(
        @RequestParam(defaultValue = "0") int page,
        @RequestParam(defaultValue = "10") int size
    ) {
        return userService.findAll(page, size);
    }

    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.findById(id);
    }

    @PostMapping
    public User createUser(@Valid @RequestBody User user) {
        return userService.save(user);
    }

    @PutMapping("/{id}")
    public User updateUser(
        @PathVariable Long id,
        @Valid @RequestBody User user
    ) {
        return userService.update(id, user);
    }

    @DeleteMapping("/{id}")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void deleteUser(@PathVariable Long id) {
        userService.delete(id);
    }
}

まとめ:アノテーションでSpring Bootをマスターしよう

Spring Bootのアノテーションについて、ここまで詳しく見てきました。最後に要点を整理しておきましょう。

重要なアノテーションの分類:

起動・設定系:

  • @SpringBootApplication:アプリケーションの起点
  • @Configuration:設定クラス
  • @Bean:Bean定義

コンポーネント定義系:

  • @Component:汎用コンポーネント
  • @Controller / @RestController:コントローラー
  • @Service:サービス層
  • @Repository:データアクセス層

依存性注入系:

  • @Autowired:自動注入
  • @Qualifier:注入対象の指定

リクエスト処理系:

  • @GetMapping / @PostMapping など:HTTPメソッドマッピング
  • @PathVariable:パス変数
  • @RequestParam:クエリパラメータ
  • @RequestBody:リクエストボディ

データベース系:

  • @Entity:エンティティクラス
  • @Id:主キー
  • @Transactional:トランザクション管理

コメント

タイトルとURLをコピーしました