2012-02-11
WicketのComponentにオブジェクトをインジェクトする
それからJavaEE6の新仕様であるCDIも大好きです。
だったらWicketの中でCDIを使いたくなるのは、ごく自然な流れ。
一応WicketとCDIを統合するライブラリもあるにはあるようですが、まともに動いたことがないんですよね。。。
そんなわけで今回はこれを自作してみました。
public class MyApplication extends WebApplication { @Override public Class<? extends Page> getHomePage() { return HomePage.class; } @Override protected void init() { try { final BeanManager beanManager = InitialContext.doLookup("java:comp/BeanManager"); getComponentInstantiationListeners().add(new IComponentInstantiationListener() { @Override public void onInstantiation(final Component pComponent) { inject(beanManager, pComponent); } }); } catch (final NamingException e) { throw new IllegalStateException(e); } } @SuppressWarnings({ "rawtypes", "unchecked" }) protected void inject(final BeanManager pBeanManager, final Component pComponent) { final Class pType = pComponent.getClass(); final Bean<Object> bean = (Bean<Object>) pBeanManager.resolve(pBeanManager.getBeans(pType)); final CreationalContext<Object> cc = pBeanManager.createCreationalContext(bean); final AnnotatedType<Object> at = pBeanManager.createAnnotatedType(pType); final InjectionTarget<Object> it = pBeanManager.createInjectionTarget(at); it.inject(pComponent, cc); } }
やってることは単純で、IComponentInstantiationListenerを使ってComponentがインスタンス化されるタイミングをフックして、そこでBeanManagerで明示的にインジェクトしてあげているだけです。
改善点はもちろんあります。JNDIが使えない環境では動かない、とか全てのComponentじゃなくてWebPageにだけDIすれば充分なんじゃない?とか。
でもアイデアの核は上記コードに凝縮されています。
CDIに勝ってる?
実はこの方法、本家CDIより機能的に上回っている部分があります。それはnewで生成したComponentにもDI可能なこと。
これはWicketのIComponentInstantiationListenerのおかげです。WicketのIComponentListenerListenerはCompnentクラスのコンストラクタの中から呼び出されるので、こんなことが可能になります。
以下がその部分のコードです。
public Component(final String id, final IModel<?> model)
{
setId(id);
getApplication().getComponentInstantiationListeners().onInstantiation(this);
...(以下省略)
}
初めてこのコードを見たときは「なるほど!」と膝を打ってしまいました。
Wicketって、本当におもしろい。
トラックバック - http://d.hatena.ne.jp/jabaraster/20120211/1328932645
リンク元
- 41 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=14&ved=0CEkQFjADOAo&url=http://d.hatena.ne.jp/jabaraster/20111103/1320298584&ctbs=qdr:y,lr:lang_1ja&ei=35BAT5qoK8P2mAXW09zfBw&usg=AFQjCNF1vlQqLvPvhmvY737yBritwE91AA
- 35 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CDgQFjAB&url=http://d.hatena.ne.jp/jabaraster/20111021/1319152454&ei=zOU-T93LEOzymAW5uNHSBw&usg=AFQjCNHQKu3aPODC8IHnUA8k6Cue4EX4QQ
- 27 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cts=1330655681679&ved=0CDcQFjAC&url=http://d.hatena.ne.jp/jabaraster/?of=20&ei=tjFQT_u6IovDmQWE892QCg&usg=AFQjCNFOkziDJGRx0eWpswNanafIwXwbag&sig2=OwZFB4SSZ59U-tH6fqHX_A
- 22 http://search.yahoo.co.jp/search?p=JSF+行ごとに色を変える&tid=top_ga1&ei=UTF-8&qrw=0&pstart=1&fr=top_ga1&b=11
- 20 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&cts=1331214263096&ved=0CEcQFjAD&url=http://d.hatena.ne.jp/jabaraster/20120126/1327592851&ei=rbdYT6HgM82XiQfOwt27DQ&usg=AFQjCNG_i1rjw7xNhxPZnDpuFGcHoR4REA&sig2=-BpMd4mV9r8vSG1YtbB
- 11 http://www.google.co.jp/url?sa=t&rct=j&q=じゃばら html&source=web&cd=4&ved=0CFYQFjAD&url=http://d.hatena.ne.jp/jabaraster/20111116/1321399209&ei=9pZMT8KfGobnmAXgmf38Dw&usg=AFQjCNHLQ8A2DiO8z2sHF8zd2eTkv0qFPg&
- 11 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=2&sqi=2&ved=0CC4QFjAB&url=http://d.hatena.ne.jp/jabaraster/20110131/1296423509&ei=EJdoT5pQhf-YBdqdgZoJ&usg=AFQjCNGQPOEA5cPND85yhu-KuxXWuA9H7g&sig2=sov8MaTfqcyYTsqzJsruHQ
- 10 http://www.google.com/search
- 8 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&cts=1331220245287&ved=0CFoQFjAF&url=http://d.hatena.ne.jp/jabaraster/20120126/1327592851&ei=Cs9YT6SyM42iiAf-_cW6DQ&usg=AFQjCNG_i1rjw7xNhxPZnDpuFGcHoR4REA&sig2=aknnViD82G7cvJomp5p
- 7 http://www.google.co.jp/url?sa=t&rct=j&q=eclipse+jsf2.0&source=web&cd=3&ved=0CEAQFjAC&url=http://d.hatena.ne.jp/jabaraster/20110131/1296423509&ei=ueQ9T6KrDYbciQL72PW5AQ&usg=AFQjCNGQPOEA5cPND85yhu-KuxXWuA9H7g
