SpringアノテーションによるBean管理と依存注入の実践

@Component系アノテーションでBeanを定義する

@Component("dataAccessor")
public class DataAccessorImpl implements DataAccessor {}

@Service
public class BusinessServiceImpl implements BusinessService {}

設定ファイルでは、コンポーネントスキャンによりパッケージ内のBeanを自動検出します:

<context:component-scan base-package="com.example" />

レイヤーごとの専用アノテーションも利用可能です:

  • @Controller:プレゼンテーション層
  • @Service:ビジネスロジック層
  • @Repository:データアクセス層

XML不要:Javaクラスによる完全アノテーション設定

@Configuration
@ComponentScan({"com.example.service", "com.example.repo"})
public class AppConfig {}

コンテナ起動時は、XMLではなくJava設定クラスを指定します:

ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);

Beanのスコープとライフサイクル制御

@Repository
@Scope("prototype")
public class DataAccessorImpl implements DataAccessor {
    
    @PostConstruct
    public void setup() {
        System.out.println("Bean初期化完了");
    }

    @PreDestroy
    public void cleanup() {
        System.out.println("Bean破棄開始");
    }
}

自動依存注入の実装

@Service
public class BusinessServiceImpl implements BusinessService {

    @Autowired
    private DataAccessor accessor;

    @Autowired
    @Qualifier("secondaryAccessor")
    private DataAccessor backupAccessor;

    @Value("${app.timeout:3000}")
    private int timeout;
}

外部プロパティファイルの読み込みには@PropertySourceを使用:

@Configuration
@PropertySource("classpath:app-config.properties")
public class AppConfig {}

サードパーティ製Beanの統合

public class DataSourceConfig {

    @Value("${db.driver}")
    private String driverClass;

    @Bean
    public DataSource appDataSource(TransactionLogger logger) {
        HikariConfig config = new HikariConfig();
        config.setDriverClassName(driverClass);
        config.setJdbcUrl("jdbc:h2:mem:test");
        System.out.println("トランザクションロガー注入: " + logger);
        return new HikariDataSource(config);
    }
}

設定クラスへの統合は@Importで明示的に行います:

@Configuration
@Import(DataSourceConfig.class)
public class AppConfig {}

タグ: Spring Annotation DependencyInjection

5月23日 05:36 投稿