DIの基本の@Autowiredと@Componentを理解する

spring

springの特徴としてDIがあります。springではプログラム中でnew(インスタンス化)することなく、インターフェースを使って実クラスをコンポーネント化します。

「@Autowired」と「@Component」はspringのもっとも基本的な部分です。
springのアノテーションで使用頻度は非常に高いです。
今回はコンポーネント化で必要な「@Autowired」と「@Component」の使い方について解説していきます。このサイトではspring3.0以上を対象に解説を進めていきます。

[スポンサーリンク]

この章でやること

「@Autowired」と「@Component」の基本的な使い方を解説します。

springMVCのバージョン

org.springframework-versionは、3.1.0を使っています。
javaは、1.6.0を使っています。

今回作成したクラス&設定ファイルはこちらです。

修正ファイル一覧

springMVCのひな型の作成方法は、「springsource tool suite Webアプリを自動生成してみよう編」を参照して下さい。

Daoインターフェースを作成します。

/**
 * ダミーのDaoクラスです。実際にDB接続はしていません。
 */
public interface ExampleDao {

	public String find();
}

Daoクラスを作成します。

@Component
public class ExampleDaoImpl implements ExampleDao {

	public String find() {
		return "test dao!!";
	}

}

@ComponentでExampleDao(インターフェース)に対応するコンポーネントを作成しています。implementsすることで基本的にはxml等に設定することなくコンポーネント化出来ます。

サービスインターフェースを作成します。

/**
 * Daoクラスを呼び出すサンプルサービスクラスです。
 */
public interface ExampleServoce {

	public String find();
}

サービスクラスを作成します。

@Component
public class ExampleServoceImpl implements ExampleServoce {

	@Autowired
	private ExampleDao exampleDao;

	public String find() {
		return exampleDao.find();
	}

}

@Autowiredを指定することによって、先ほど作成したコンポーネントをインジェクション(注入)します。

コントローラクラスを作成します。

/**
 * サービスクラスを呼び出すサンプルコントローラクラスです。
 */
@Controller
public class ExampleController {

	@Autowired
	private ExampleServoce exampleServoce;

	private static final Logger logger =
			LoggerFactory.getLogger(ExampleController.class);

	@RequestMapping(value = "/example", method = RequestMethod.GET)
	public String get(Locale locale, Model model) {
		logger.debug("API start");

		model.addAttribute("find", exampleServoce.find() );
		return "example";
	}
}

JSP(example.jsp)を作成します。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
    <title>example</title>
</head>
<body>
<h1>
    example!  
</h1>

<P>  dao message is [${find}]. </P>
</body>
</html>

ダミーのDaoクラスが出力した文字列を表示します。

servlet-context.xmlに設定を追加します。

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

1行目で@Autowiredや@Componentが使えるよう設定しています。
2行目でコンポーネントがスキャン(読み込める)よう設定しています。

実行しましょう

ブラウザからの実行方法については、「springsource tool suite Webアプリを自動生成してみよう編」を参照して下さい。

実行結果

解説

spring2.4以前では、DIの設定をxmlファイルに記述していましたが、spring2.5以降ではアノテーションを使うことでDIの実現が可能になりました。要点としては大雑把に言えば2つあります。
1つ目は、「@Component」を使うことによってインターフェースに対応した実クラスをコンポーネント化します。
2つ目は、「@Autowired」を使って各クラスのメンバ変数へインジェクション(注入)すること出来ます。

最後に

コンポーネント化について「@Component」以外のアノテーションを使うこともspringでは可能です。サービスクラス用やDaoクラス用など用途によって使い分けることも出来るので次回あたりはこの辺についてもまとめていきたいと思います。
また、今回紹介した方法だと、コンポーネント名がインターフェース名と同じになっています。こちら任意の名前をつけることも可能なのでこちらについてもいつか紹介したいと考えています。
spring2.4時代だとxmlで全て表現していましたが、spring2.5以降はアノテーションで表現できるので個人的には大分スッキリした感があります。好みの問題なのでしょうが、私の周りでもアノテーション派の人がとても多いのかなーといったイメージです。やはりアノテーションの方がよいですね。(思いっきり主観ですが)