読者です 読者をやめる 読者になる 読者になる

DailySingleton

「DBやファイルからデータを持ってきてキャッシュするけど、1日1回取り直したい」という要望はわりとあると思います。
今作っているシステムでもそういう機能が必要で、ただしキャッシュするような大掛かりな仕組みはいらなかったのでちょっとしたクラスを作って対応したのですが、これがコンテナレベルで出来ると便利だなと思いました。
イメージとしてはこんな感じです。

/**
 * 3:00にT2のホームページをキャッシュするシングルトン
 */
@DailySingleton("03:00")
public class T2HomePageCache implements HomePageCache{

  private String html;

  @Init
  public void update(){
    HttpConnection con = new HttpConnection("http://www.t2framework.org/");
    html = con.getBody();
    con.close();
  }
  public void getHtml(){
    return html;
  }
}

//利用側
@Singleton
public class OreOreGoogle{

  private HomePageCache homePageCache;
  @Inject
  public void setHomePageCache(HomePageCache value){
    this.homePageCache = value;
  }

  public String search(){
    return homePageCache.getHtml();
  }
}

コンテナは、アノテーションに設定してある時間(この場合3時)になるとインスタンスを破棄して、新しいインスタンスを作ります。
その後、以前にインジェクトしたオブジェクトに対して、再度セットします。
実際は、インジェクトした変数を別の変数に取られたりするとダメだったり(この場合はhomePageCacheを別の変数に入れて使うとか)、再DIするためにDIした相手を覚えておかないといけなかったり
、その際に利用側をうまくロックしないといけなかったり必要がありますが。