読者です 読者をやめる 読者になる 読者になる

だったら壁にでも話してろよ。

技術ネタはQiitaに移行したので、出口のない悩みや考えを垂れ流すことにします。

Spring Boot で applicationContext.xml の ref 属性を表現する

Spring Framework 4、および Boot あたりから、本格的にアノテーションベースのコンフィグレーションに移行が進んでいる。これに際して、Spring Framework が直接使用するコンフィグレーションに関しては、すべてアノテーションベースに移行しようと思い試したところ、表題にあるような、applicationContext.xml でごく普通に使用していた、ref 属性に相当する書き方はどのようになるのか、しばらく書き方がわからず、けっこうハマったので残しておく。

書き方はというと、参照される側 (@Bean 属性を適用した Bean メソッド) の名前をキーに使用して、参照する側 (ref 属性を使用したい Bean メソッド) の引数で、オートワイヤリングして、DI をかけてやる。名前の特定には、@Qualifier アノテーションを使用する。以下のようになる。

@Autowired
@Bean
public SqlSessionTemplate sqlSessionTemplate(
        @Qualifier("dataSource") DataSource dataSource) throws Exception {
    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    bean.setDataSource(dataSource);

    ResourcePatternResolver resolver = ResourcePatternUtils.getResourcePatternResolver(
            new DefaultResourceLoader());

    bean.setConfigLocation(resolver.getResource("classpath:mybatis-config.xml"));
    bean.setMapperLocations(resolver.getResources("classpath:sql/*.xml"));

    return new SqlSessionTemplate(bean.getObject());
}

@Primary
@Autowired
@Bean
public DriverManagerDataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    // dataSource.set ...

    return dataSource;
}

このように ref 属性相当の書き方をしないとならない場面が少なからずあるので、必ずおさえておきたい。