ITエンジニアSAIの技術関連備忘録

技術的な内容を忘れないようにメモ....

Spring Boot 入門 備忘録

 1.環境

windows7 32bit
java8
 
 
起動クラス
SaikiApplication.java
@SpringBootApplication
public class SaikiApplication extends SpringBootServletInitializer{
 
     public static void main(String[] args) {
          SpringApplication.run(SaikiApplication.class, args);
     }
 
     @Override
     protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
          return application.sources(SaikiApplication.class);
     }
}
 
 
サーブレット初期化子の追加
これを書かないとwar作成時にweb.xmlが生成されないらしい。
 
コントローラーの作成
SaikiHomeController.java
@Controller
public class SaikiHomeController {
 
@RequestMapping(value="/saiki", method = RequestMethod.GET)
public String test(Model model, HttpServletRequest request, HttpServletResponse response) {
 
Person saiki1 = new Person("001", "saiki1", 20);
Person saiki2 = new Person("002", "saiki2", 23);
Person saiki3 = new Person("003", "saiki3", 24);
Person saiki4 = new Person("004", "saiki4", 27);
Person saiki5 = new Person("005", "saiki5", 30);
 
List<Person> members = new ArrayList<Person>();
members.add(saiki1);
members.add(saiki2);
members.add(saiki3);
members.add(saiki4);
members.add(saiki5);
 
System.out.println("★★★" + request.getLocalAddr());
 
model.addAttribute("msg","サンプルメッセージ!テスト!");
model.addAttribute("members",members);
 
return "test";
}
 
画面の作成
test.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>top page</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
test
  <p th:text="${msg}" />
  <table>
  <tr>
  <th>ID</th>
  <th>Name</th>
  <th>Age</th>
  </tr>
  <tr th:each="member:${members}">
  <td th:text="${member.id}"></td>
  <td th:text="${member.name}"></td>
  <td th:text="${member.age}"></td>
  </tr>
  </table>
</body>
</html>
 
上記作成後
にアクセスすると

f:id:y_saiki:20170411001954p:image

 
 
インターセプターを作成する
SaikiInterceptor.java
public class SaikiInterceptor implements HandlerInterceptor {
 
//private static final Logger LOGGER = LoggerFactory.getLogger(SaikiInterceptor.class);
 
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//コントローラメソッドの実行前
//LOGGER.debug("preHandleメソッドの実行");
System.out.println("preHandleメソッドの実行");
return true;
}
 
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
//コントローラメソッドの実行後
//LOGGER.debug("postHandleメソッドの実行");
System.out.println("postHandleメソッドの実行");
}
 
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
//リクエスト処理が完了した後
//LOGGER.debug("afterCompletionメソッドの実行");
System.out.println("afterCompletionメソッドの実行");
}
}
 
作成したインターセプタークラスを設定するためのクラスを作成する
AppConfig.java
@Configuration
public class AppConfig extends WebMvcConfigurerAdapter {
 
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(saikiInterceptor());
}
 
@Bean
public SaikiInterceptor saikiInterceptor() {
return new SaikiInterceptor();
}
}
 
上記作成後
にアクセスすると

 

f:id:y_saiki:20170411001956p:image

 
 
次は例外ハンドリングについて
 
実際に実装したやつ
エラー画面の作成
error.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>top page</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
test
  <p th:text="${msg}" />
  <table>
  <tr>
  <th>ID</th>
  <th>Name</th>
  <th>Age</th>
  </tr>
  <tr th:each="member:${members}">
  <td th:text="${member.id}"></td>
  <td th:text="${member.name}"></td>
  <td th:text="${member.age}"></td>
  </tr>
  </table>
</body>
</html>
 
例外ハンドリングクラス
SaikiExceptionHandler.java
@ControllerAdvice
public class SaikiExceptionHandler {
 
@ExceptionHandler(SaikiAppException.class)
public String errorHandle(Model model) {
System.out.println("例外発生");
return "error";
}
}
 
 
例外クラス
ここは適当です。。
SaikiAppException.java
public class SaikiAppException extends RuntimeException{
 
  private int state = 0;
 
  private String error = null;
 
  private String errorDescription = null;
 
public SaikiAppException(int state, String error, String errorDescription) {
super();
this.state = state;
this.error = error;
this.errorDescription = errorDescription;
}
 
/**
* @return state
*/
public int getState() {
return state;
}
 
/**
* @param state セットする state
*/
public void setState(int state) {
this.state = state;
}
 
/**
* @return error
*/
public String getError() {
return error;
}
 
/**
* @param error セットする error
*/
public void setError(String error) {
this.error = error;
}
 
/**
* @return errorDescription
*/
public String getErrorDescription() {
return errorDescription;
}
 
/**
* @param errorDescription セットする errorDescription
*/
public void setErrorDescription(String errorDescription) {
this.errorDescription = errorDescription;
}
}
 
上記作成後
にアクセスすると

 

f:id:y_saiki:20170411001959p:image

 
エラー画面は表示されなかったんだけど、、、
先ほど作成した SaikiExceptionHandlerのerrorHandleメソッドが呼ばれていることがわかる。
 
 
springでの開発効率を上げてくれる開発ツール 

 
Spring Boot 1.3 からspring-boot-devtoolsという開発補助モジュールが導入されている。
 
導入方法はbuild.gradleに以下を追加してリフレッシュするだけ。
dependencies {
  compile("org.springframework.boot:spring-boot-devtools")
}
 
springで特定クラスを遅延生成させたい場合

 
そのクラスに対して@Lazyを付与する。
@Controller
@Lazy
public class LoginController {
または、
@Authowired
@Lazy
LogicService logicService
こんな感じ
 
そして、全てのクラスを遅延生成させたい場合には BeanFactoryPostProcessor インターフェースを実装した Java Configuration のクラスを作成して、その中で setLazyInit(true) を呼び出せばよいそう。
 
 
書籍で詳しく学習するなら以下が参考になるかと、