2014年6月12日木曜日

staticメソッドへのDI

DIのことよく分かってないままにSpringで実装してたのでつまづいた。のでメモ。



ちなみにDIについてはマネージャに教えて頂いたこのページが分かり易かった。
>>要するに DI って何なのという話 - 猫型の蓄音機は 1 分間に 45 回にゃあと鳴く


つまづいたのはstaticメソッドでDIしたフィールドを使おうとしたとき。
改修しなきゃいけないとこがstaticメソッド内だったんでどうしてもそん中でDIしたDaoを使いたかったんだけど、@Autowiredはstaticフィールドには使えない。。

てことで、staticフィールドに直接DIしないでsetterに@Autowiredをつける。
setter経由でDI。
なんとなくこんな感じ。

public class StaticTest {
 static TestDao testDao;

 @Autowired
 public void setTestDao(TestDao testDao) {
     StaticTest.testDao = testDao;
 }

 static String getTestData(int id) {
  return testDao.selectDataById(id);
 }
}

でもこれだと本番環境でのテストでうまくいかず…多分大丈夫な気がするんだが…
でやり方変えて直接xmlから定義情報とってくる感じでセット。
一応これでうまくはいった。。

public class StaticTest {
 static ApplicationContext appCtx;
 static TestDao testDao;

 static {
  initializeStaticDao();
 }

 private static void initializeStaticDao() {
  appCtx = new ClassPathXmlApplicationContext(new String[] { "ApplicationContext.xml" });
  testDao = (TestDao) appCtx.getBean("TestDao");
 }

 static String getTestData(int id) {
  return testDao.selectDataById(id);
 }
}

0 件のコメント:

コメントを投稿