例えば、staticメソッド内でデータベースアクセスをする等、staticメソッドからDIされるオブジェクトを呼び出したい場合もある。
しかし、DIされるオブジェクトのメソッドがstaticメソッドでないことが多いため、直接、staticメソッドからDIされるオブジェクトを呼び出すことができない。そこで、あらかじめDIされるオブジェクトをstatic変数で宣言し、その変数へのsetterメソッドを通してDIされるオブジェクトの生成が行えるようにする。
今回は、staticメソッド内でDIを利用するサンプルプログラムを通して、その実装方法を共有する。
前提条件
以下の記事のSpring BootのWEB画面用アプリが作成済であること。
やってみたこと
DIに関連するクラスの作成
今回は、staticメソッドをもつクラス内で、DIされる側のクラスのメソッド呼び出しを行った。今回作成したプログラム構成は以下の通り。
また、「DemoUtil.java」「DemoComponent.java」の内容は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | package com.example.demo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * staticメソッドからDIによるオブジェクトのメソッドを呼び出すサンプル */ @Component public class DemoUtil { /** staticメソッドから呼び出せるよう、DIするオブジェクトをstatic変数で宣言 */ private static DemoComponent demoComponent; /** * Spring Boot起動時に、DIするオブジェクトを生成し、先ほど宣言したstatic変数に設定 * @param demoComponent DemoComponentインスタンス */ @Autowired public void setDemoComponent(DemoComponent demoComponent){ DemoUtil.demoComponent = demoComponent; } /** * DemoComponentオブジェクトからメッセージを取得するメソッドを呼び出す * @return 取得したメッセージ */ public static String getMessage(){ return demoComponent.getMessageFromComponent(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 | package com.example.demo; import org.springframework.stereotype.Component; @Component public class DemoComponent { public String getMessageFromComponent(){ return "このメッセージはDemoComponentから取得しました"; } } |
上記プログラムのように、staticメソッドをもつクラス(DemoUtil.java)に内でDIされる側のクラス(DemoComponent.java)のstatic変数を用意しておき、Spring Boot起動時にそのstatic変数にDIするオブジェクトを設定されるようにしておけば、staticメソッドをもつクラス内で、DIされる側のクラスのメソッドを呼び出すことができる。
コントローラクラス・HTMLの作成と動作検証
今回は、コントローラクラス(DemoController.java)の中で、staticメソッドをもつクラス(DemoUtil.java)のメソッドを呼び出し、呼び出した結果をmsgオブジェクトに格納し、それをHTML(index.html)で表示した。
「DemoController.java」「index.html」の内容は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class DemoController { @RequestMapping("/") public ModelAndView index(ModelAndView mav){ String str = DemoUtil.getMessage(); mav.addObject("msg", str); mav.setViewName("index"); return mav; } } |
1 2 3 4 5 6 7 8 9 10 11 | <!DOCTYPE html> <html lang="ja" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>index page</title> </head> <body> メッセージの取得結果: <p th:text="${msg}">ここに設定したメッセージが設定されます</p> </body> </html> |
その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/di-in-static-method/demo
その後、Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスした結果は以下の通りで、staticメソッドをもつクラス(DemoUtil.java)のメソッドを呼び出した結果が、画面上に表示されることを確認した。
要点まとめ
- staticメソッドからDIされるオブジェクトのメソッドを呼び出すには、あらかじめDIされるオブジェクトをstatic変数で宣言し、その変数へのsetterメソッドを通してDIされるオブジェクトの生成が行えるようにする。