【備忘録】DIのお勉強

#SpringFramework DIのお勉強

今年から仕事でSpringを使って製造を行う機会がありそうなので勉強をし始めました。（もうほぼ自分のOUTPUT用のものです・・すみません　笑）
これまでSpringで作られたパッケージをカスタマイズすることはあったものの他の機能をコピーして構築する場合が多く全然理解せずままやってきた代償ですね＾＾；
私は特殊なキャリアを歩んでおり、保守系案件（SE兼PG）→新規開発案件（SE）という感じでまともにPGをやってきてないのが現状です。

今の時代はやっぱりマルチに工程をこなせる人の方がスケジュールも組みやすく活躍できる幅が広がるのでこの機会をものにしようと思ってこの記事書いてます！


#参考サイト
以下のサイトを参考にして作業を進めました。こういう記事があるの助かります。感謝です。
・http://javatechnology.net/spring/di-autowired-component/

#作業
##１．プロジェクトの作成
まず、以下の操作でプロジェクトを作成します。
「ファイル」→「新規」→「Spring　レガシー・プロジェクト」→「Spring　MVC　プロジェクト」
プロジェクト名の欄に「AplExample」を入力して完了します。
（すみません。今回コンテキストは「apl」にしてます。）

##２．ファイルの作成
以下の画面内の6ファイルを作成します。
・ExampleDao.java
・ExampleDaoImpl.java
・ExampleService.java
・ExampleServiceImpl.java
・ExampleController.java
・example.jsp(home.jspと同階層に作成)

<img width="269" alt="apl01.png" src="https://qiita-image-store.s3.amazonaws.com/0/154145/c6c689f4-3d3a-38ff-0d6d-33e935c8881d.png">


###各ファイルの内容

データアクセスのインターフェース

```ExampleDao.java
package com.example.dao;

public interface ExampleDao {
	public String find();
}
```

以下、@Componentをつけることにより、アノテーションに付与したクラスをSpringのDIコンテナに
beanとして登録する。
ちなみに@Component以外にも、@Contorollerとか、@Serviceとかあるが基本的に動作は同じで使う場所によってアノテーションを使い分ける。
ってか、この場合だと「@Componentではなく@Repository」のが適切なのかな。。


```ExampleDaoImpl.java
package com.example.dao;

import org.springframework.stereotype.Component;

@Component
public class ExampleDaoImpl implements ExampleDao{
	public String find() {
		return "日々勉強、学ぶことが多い";
	}
}
```



```ExampleService.java
package com.example.service;

public interface ExampleService {
	public String find();
}
```

以下、@Autowirdをつけることにより、@Componentしたクラスから該当するものを探してくれて
newしてインスタンス変数にデータを入れてくれる。

```ExampleServiceImpl.java
package com.example.service;

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

import com.example.dao.ExampleDao;

@Component
public class ExampleServiceImpl implements ExampleService{

	@Autowired
	private ExampleDao exampleDao;

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

}

```

```ExampleController.java
package com.example.apl;

import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.example.service.ExampleService;

@Controller
public class ExampleController {

	@Autowired
	private ExampleService exampleService;

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

	@RequestMapping(value = "/example", method = RequestMethod.GET)
	public String get(Locale locate, Model model) {

		logger.debug("API start");

		model.addAttribute("find", exampleService.find());

		return "example";
	}

}
```

```example.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>example</title>
</head>
<body>
 <h1>
 example!
 </h1>

<p> メッセージの表示：${find}.</p>

</body>
</html>
```

##３．実行結果
うまく表示されました。
なんとなく分かったけどもっとなぜなぜして一つ一つのコードの意味を理解しないとダメだな＾＾
まだまだ未熟者なので、ここのソースはこう書いた方がいいとか、アドバイスあれば連絡ください！
<img width="403" alt="apl02.png" src="https://qiita-image-store.s3.amazonaws.com/0/154145/9db6a6f2-103a-ffb1-65c8-cf59a7047339.png">