AutowiredによるDI

エントリポイントからgetBeanメソッドを使用してBeanを取得せずに@Autowiredアノテーションを使用してDIコンテナがインジェクションする(インスタンスを生成する必要がない)フィールドを指定するクラス(これもBean)を作成します。

 

package com.confrage.app;

import org.springframework.beans.factory.annotation.Autowired;

public class AutoWire {
  @Autowired
  AppendString appStr;
  public void run(){
    String str = appStr.append("test1", "test2");
    System.out.println(str);
  }
}

DIコンテナは以下のようにBeanを定義します。

package com.confrage;

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

import com.confrage.app.AppendString;
import com.confrage.app.AutoWire;

@Configuration
public class AppConfig {
  @Bean
  AppendString getMsg(){
    return new AppendString();
  }

  @Bean
  AutoWire frontend(){
    return new AutoWire();
  }
}

先ほど作成したBeanはfrontendメソッド内でインスタンスを生成してreturnします。

エントリポイントはAutoWireクラスのrunメソッドを実行するだけです。

package com.confrage;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import;

import com.confrage.app.AutoWire;

@EnableAutoConfiguration
@Import(AppConfig.class)
public class SpringbootDiApplication {
  public static void main(String[] args) {
    ConfigurableApplicationContext context = 
      SpringApplication.run(SpringbootDiApplication.class, args);
    // Configで指定したオートワイヤリングのBean名にする
    AutoWire getMsg = context.getBean(AutoWire.class);
    getMsg.run();
  }
}

AutowiredによるDI

コメント

タイトルとURLをコピーしました