🐥

SpringBootで使用するアノテーション

2024/07/26に公開

Spring Bootは、JavaやKotlinでの迅速なアプリケーション開発を支援するフレームワークです。Spring Bootでは多くのアノテーションが提供されており、それらを使用することで設定やコーディングが簡素化されます。以下に、Spring Bootでよく使用されるアノテーションとその具体例をKotlinで説明します。

1. @SpringBootApplication

@SpringBootApplicationは、Spring Bootアプリケーションのエントリーポイントに付けるアノテーションです。このアノテーションは、以下の3つのアノテーションをまとめたものです。

@Configuration
@EnableAutoConfiguration
@ComponentScan
このアノテーションを付けることで、Spring Bootアプリケーションの基本的な設定が自動的に行われます。

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class Application

fun main(args: Array<String>) {
    runApplication<Application>(*args)
}

2. @RestController

@RestControllerは、クラスがRESTfulなWebサービスのコントローラーであることを示します。このアノテーションを付けることで、クラス内のメソッドは自動的にJSON形式のレスポンスを返すようになります。

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController

@RestController
class HelloController {

    @GetMapping("/hello")
    fun sayHello(): String {
        return "Hello, Spring Boot with Kotlin!"
    }
}

3. @RequestMapping

@RequestMappingは、特定のURLに対するHTTPリクエストを処理するメソッドやクラスに付けるアノテーションです。メソッドレベルで使う場合は、@GetMapping、@PostMappingなどの特定のHTTPメソッドを指定するアノテーションを使うことが多いです。

import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestMethod
import org.springframework.web.bind.annotation.RestController

@RestController
@RequestMapping("/api")
class ApiController {

    @RequestMapping(value = ["/greet"], method = [RequestMethod.GET])
    fun greet(): String {
        return "Greetings from the API!"
    }
}

4. @GetMapping、@PostMapping、@PutMapping、@DeleteMapping

これらのアノテーションは、それぞれHTTPのGET、POST、PUT、DELETEリクエストを処理するメソッドに付けるものです。@RequestMappingの簡略化された形式として使われます。

import org.springframework.web.bind.annotation.*

@RestController
@RequestMapping("/items")
class ItemController {

    @GetMapping
    fun getAllItems(): List<String> {
        return listOf("Item1", "Item2")
    }

    @PostMapping
    fun addItem(@RequestBody item: String): String {
        return "Added $item"
    }

    @PutMapping("/{id}")
    fun updateItem(@PathVariable id: Long, @RequestBody item: String): String {
        return "Updated item $id to $item"
    }

    @DeleteMapping("/{id}")
    fun deleteItem(@PathVariable id: Long): String {
        return "Deleted item $id"
    }
}

5. @Autowired

@Autowiredは、Springの依存性注入機能を使用してBeanを自動的にインジェクションするためのアノテーションです。コンストラクタ、フィールド、またはメソッドに適用できます。

import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController

@Service
class GreetingService {
    fun greet(name: String): String {
        return "Hello, $name"
    }
}

@RestController
class GreetingController(@Autowired val greetingService: GreetingService) {

    @GetMapping("/greet")
    fun greet(@RequestParam name: String): String {
        return greetingService.greet(name)
    }
}

6. @Service

@Serviceは、サービスレイヤーを表すクラスに付けるアノテーションです。これは@Componentの特化形であり、サービスを表す意図を明確にします。

import org.springframework.stereotype.Service

@Service
class UserService {

    fun getUser(): String {
        return "User: John Doe"
    }
}

7. @Repository

@Repositoryは、データアクセスレイヤーを表すクラスに付けるアノテーションです。これは@Componentの特化形であり、データベース操作を行うクラスを示します。

import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
import javax.persistence.Id

@Entity
data class User(
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Long,
    val name: String
)

@Repository
interface UserRepository : JpaRepository<User, Long>

8. @Entity

@Entityは、JPA(Java Persistence API)エンティティを示すクラスに付けるアノテーションです。データベースのテーブルとマッピングされます。

import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
import javax.persistence.Id

@Entity
data class Product(
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Long,
    val name: String,
    val price: Double
)

9. @Configuration

@Configurationは、SpringコンテナにBean定義を提供するクラスに付けるアノテーションです。このクラスは、Javaベースの設定を行うために使用されます。

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
class AppConfig {

    @Bean
    fun greetingService(): GreetingService {
        return GreetingService()
    }
}

10. @EnableAutoConfiguration

@EnableAutoConfigurationは、Spring Bootの自動設定機能を有効にします。@SpringBootApplicationに含まれているため、通常は明示的に使用する必要はありません。

11. @Component

@Componentは、Springのコンポーネントスキャンによって自動検出されるクラスに付けるアノテーションです。通常、サービスクラスやリポジトリクラス、その他のBeanに使用されます。

import org.springframework.stereotype.Component

@Component
class UtilityService {

    fun doSomething(): String {
        return "Utility Service doing something"
    }
}

12. @Bean

@Beanは、Springコンテナに管理されるBeanを定義するためのアノテーションです。@Configurationクラス内のメソッドに付けることが多いです。

@Configuration
class AppConfig {

    @Bean
    fun exampleBean(): ExampleService {
        return ExampleService()
    }
}

class ExampleService {
    fun execute(): String {
        return "Example Service Executed"
    }
}

13. @ConditionalOnProperty

@ConditionalOnPropertyは、特定のプロパティが設定されている場合にのみBeanを登録するためのアノテーションです。

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
class FeatureConfig {

    @Bean
    @ConditionalOnProperty(name = ["feature.enabled"], havingValue = "true")
    fun featureService(): FeatureService {
        return FeatureService()
    }
}

class FeatureService {
    fun runFeature(): String {
        return "Feature is enabled"
    }
}

14. @Value

@Valueは、プロパティファイルから値を注入するためのアノテーションです。環境設定やプロパティファイルから値を取得してフィールドに設定します。

import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Component

@Component
class ConfiguredComponent {

    @Value("\${app.message}")
    lateinit var message: String

    fun showMessage(): String {
        return "Configured message is: $message"
    }
}

まとめ

Spring Bootでは、多くのアノテーションが提供されており、これらを適切に使用することでコードが簡潔かつ分かりやすくなります。Kotlinでの具体例を通じて、各アノテーションの使用方法とその役割を理解することができます。これにより、効率的な開発が可能となり、保守性の高いコードを実現することができます。

Discussion