17049


JavaEEの`BeanManager`を使うと、手動でBeanのインスタンスを取得できますが、その方法について疑問があります。  
いくつかの解説記事を見たところ、大枠として次のようなコードでインスタンスを取得するらしいことが分かりました。

[code]

    Set<Bean<?>> beans = beanManager.getBeans(Hoge.class);
    Bean<?> bean = this.beanManager.resolve(beans);
    Object instance = beanManager.getReference(bean, Hoge.class, beanManager.createCreationalContext(bean));
    Hoge hoge = (Hoge) instance;
    
[/code]

ここで、2行目の`BeanManager#resolve`は何をしているのでしょうか？  
次の書き方と比べて、何が異なりますか？

[code]

    Bean<?> bean = beans.stream().findFirst().get();
    
[/code]

派生クラスがあった場合に何かあるのか？ とも考えましたが、だとしても何を以って`Set`から1つだけ取り出すのか分かりません。


CC BY-SA 3.0
2015-09-28T02:35:46.747
17017
2015-09-29T03:48:14.987
8078
question
java java-ee
BeanManager#resolveは何のために使用するか


[Weldの実装](https://github.com/weld/core/blob/master/impl/src/main/java/org/jboss/weld/manager/BeanManagerImpl.java#L1152)を見るのが早いかと思いますが、候補が1つに絞れる場合(すなわちbeansのsizeが1の場合)には、mok2pokさんが質問文に記載されているコードと全く同じ結果となりますね。

BeanManagerImpl:

[code]

    public <X> Bean<? extends X> resolve(Set<Bean<? extends X>> beans) {
        if (beans == null || beans.isEmpty()) {
            return null;
        }
        Set<Bean<? extends X>> resolvedBeans = beanResolver.resolve(beans);
        if (resolvedBeans.size() == 1) {
            return resolvedBeans.iterator().next();
        [後略]
    
[/code]

AbstractTypeSafeBeanResolver:

[code]

    public <X> Set<Bean<? extends X>> resolve(Set<Bean<? extends X>> beans) {
        if (beans.size() <= 1) {
            return beans;
        }
        [後略]
    
[/code]

> 派生クラスがあった場合に何かあるのか？ とも考えましたが、だとしても何を以ってSetから1つだけ取り出すのか分かりません。

候補が複数ある場合には例外AmbiguousResolutionExceptionが、1つもない場合にはnullが返ります(ので、何らかの情報で対象を1つに絞るような処理を行うわけではありません)。  
参考: [BeanManager.html#resolve(java.util.Set)
javadoc](https://docs.jboss.org/cdi/api/1.2/javax/enterprise/inject/spi/BeanManager.html#resolve\(java.util.Set\))

本題の「何のために使用するか」についてですが、上記から分かる通り、質問文中のようなコード中で用いる意味は無いです。  
(じゃあなぜそんなメソッドが存在するのか…？という点については、パッケージ名からも読み取れますがBeanManagerはそもそもSPI(Service
Provider
Interface)[(参考)](https://stackoverflow.com/questions/2954372/)に分類されるものであり、その性質を考えればresolveメソッドにも存在意義ある、というのが想像できるのではないかと。)


CC BY-SA 3.0
2015-09-29T02:56:00.677
17049
2015-09-29T03:48:14.987
2017-05-23T12:38:56.083
-1
2808
17017
answer