技術ネタはQiitaに移りました。壁もどこぞに。

Spring Boot での Bean 定義

Spring Boot でアプリケーションを作成する際に、プレーンな Spring Framework を使用した場合との違いでまず大きいのが、Bean の定義ではないかと思う。XML ベースの定義が基本的にはアノテーションベースに置き換わる。(もちろん XML ベースでの記述も可能ではあるが、多くのサンプルがアノテーションベースなので、これを理解したほうが良い。)

さて、これまで Bean 定義というと、以下のように書いていたかと思う。

<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
    <context:component-scan/>

    <bean id="mongoTemplate" name="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg name="mongo" ref="mongo"/>
        <constructor-arg name="databaseName" value="example_db"/>
    </bean>
    <bean id="mongo" class="org.springframework.data.mongodb.core.MongoFactoryBean">
        <constructor-arg name="host" value="127.0.0.1"/>
        <constructor-arg name="port" value="27017"/>
</beans>

これが、以下のように変わる。

@SpringBootApplication // <context:component-scan/> に対応 
public class Application {
    /**
     * アプリケーションの起動ポイント
     */
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public MongoTemplate mongoTemplate() throws Exception {
        return new MongoTemplate(
                this.mongo(),  // <constructor-arg name="mongo" ref="mongo"/> に対応
                "example_db"); // <constructor-arg name="databaseName" value="example_db"/> に対応
    }

    @Bean
    public Mongo mongo() throws Exception {
        return new Mongo(
                "127.0.0.1", // <constructor-arg name="host" value="127.0.0.1"/> に対応
                "27017"); // <constructor-arg name="port" value="27017"/> に対応
    }
}

タグは @Bean に対応し、作成した @Bean アノテーションのついたメソッドを他のメソッドから呼び出すと、XML での ref 属性相当になるという点さえおさえておけば、これまでとそう変わりなく使用できるはず。

コントローラや、サービスレイヤからはこれまでどおり、@Resource や、@Autowired アノテーションからインジェクションをかけることができる。