Spring Bootの@Configuration完全ガイド

# Spring Bootの@Configuration完全ガイド

## はじめに

@Configurationは、Spring Frameworkの重要なアノテーションの1つです。この記事では、@Configurationの詳細な使用方法と、関連する機能について説明します。

## 1. @Configurationの基本

### @Configurationとは

@Configurationは、Springの設定クラスを示すアノテーションです。このアノテーションが付与されたクラスは、Bean定義のソースとして扱われます。

```java
@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}
```

### 主な特徴

- Bean定義のソースとして機能
- コンポーネントスキャンの対象
- プロキシベースの設定
- 依存関係の注入

## 2. Bean定義の方法

### 基本的なBean定義

```java
@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        return new UserServiceImpl();
    }
    
    @Bean
    public UserRepository userRepository() {
        return new JdbcUserRepository();
    }
}
```

### Bean名の指定

```java
@Configuration
public class AppConfig {
    @Bean(name = "primaryUserService")
    public UserService userService() {
        return new UserServiceImpl();
    }
}
```

### Beanの初期化と破棄

```java
@Configuration
public class AppConfig {
    @Bean(initMethod = "init", destroyMethod = "cleanup")
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}
```

## 3. 依存関係の注入

### メソッド間の依存関係

```java
@Configuration
public class AppConfig {
    @Bean
    public UserService userService(UserRepository userRepository) {
        return new UserServiceImpl(userRepository);
    }
    
    @Bean
    public UserRepository userRepository(DataSource dataSource) {
        return new JdbcUserRepository(dataSource);
    }
    
    @Bean
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}
```

### 外部Beanの参照

```java
@Configuration
public class AppConfig {
    @Bean
    public UserService userService(@Autowired UserRepository userRepository) {
        return new UserServiceImpl(userRepository);
    }
}
```

## 4. 条件付きBean定義

### @ConditionalOnProperty

```java
@Configuration
public class AppConfig {
    @Bean
    @ConditionalOnProperty(name = "app.feature.enabled", havingValue = "true")
    public FeatureService featureService() {
        return new FeatureServiceImpl();
    }
}
```

### @ConditionalOnClass

```java
@Configuration
public class AppConfig {
    @Bean
    @ConditionalOnClass(name = "com.example.SpecialService")
    public SpecialService specialService() {
        return new SpecialServiceImpl();
    }
}
```

### @ConditionalOnMissingBean

```java
@Configuration
public class AppConfig {
    @Bean
    @ConditionalOnMissingBean
    public UserService userService() {
        return new DefaultUserServiceImpl();
    }
}
```

## 5. 設定の分割とインポート

### @Import

```java
@Configuration
@Import({DatabaseConfig.class, SecurityConfig.class})
public class AppConfig {
    // ...
}
```

### @ImportResource

```java
@Configuration
@ImportResource("classpath:application-context.xml")
public class AppConfig {
    // ...
}
```

## 6. プロファイルによる設定

### @Profile

```java
@Configuration
@Profile("development")
public class DevelopmentConfig {
    @Bean
    public DataSource dataSource() {
        return new H2DataSource();
    }
}

@Configuration
@Profile("production")
public class ProductionConfig {
    @Bean
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}
```

## 7. プロパティの注入

### @ConfigurationProperties

```java
@Configuration
@ConfigurationProperties(prefix = "app")
public class AppConfig {
    private String name;
    private int version;
    
    // getters and setters
}
```

### @Value

```java
@Configuration
public class AppConfig {
    @Value("${app.name}")
    private String appName;
    
    @Value("${app.version}")
    private int appVersion;
}
```

## 8. ベストプラクティス

### 設定の分割

```java
@Configuration
public class DatabaseConfig {
    @Bean
    public DataSource dataSource() {
        // ...
    }
}

@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain() {
        // ...
    }
}
```

### テスト用の設定

```java
@Configuration
@Profile("test")
public class TestConfig {
    @Bean
    public UserRepository userRepository() {
        return new MockUserRepository();
    }
}
```

### 環境固有の設定

```java
@Configuration
@Profile("dev")
public class DevConfig {
    @Bean
    public LoggingService loggingService() {
        return new DevLoggingService();
    }
}
```

## まとめ

この記事では、@Configurationの詳細な使用方法について説明しました。主なポイントは以下の通りです：

1. 基本的なBean定義
2. 依存関係の注入
3. 条件付きBean定義
4. 設定の分割とインポート
5. プロファイルによる設定
6. プロパティの注入
7. ベストプラクティス

@Configurationを適切に使用することで、柔軟で保守性の高いアプリケーション設定が可能になります。

## 参考資料

- [Spring Framework公式ドキュメント](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-java)
- [Spring Boot公式ドキュメント](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.spring-application.configuration-classes)
- [Spring Configuration Properties](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config.typesafe-configuration-properties)