2016-03-14 6 views
5

Genericサブタイプに特定の汎用Beanを注入しようとしていますが、Springは依存性を解決できません。 Beanから型を削除することで、すべてが期待通りに機能します。ここで汎用サブタイプのSpringへの依存性注入

public class AbstractFrom{ 
    // ... 
} 

public class EmployyForm extends AbstractFrom{ 
    // ... 
} 

public class CompanyForm extends AbstractFrom{ 
    // ... 
} 

abstract class AbstractBean<T extends AbstractFrom>{ 

    public abstract void calculate(T form); 
} 

@Component 
public CompanyBean extends AbstractBean<CompanyForm>{ 

    public void calculate(CompanyForm form){ 
     // specific impl 
    } 
} 

@Component 
public EmployeeBean extends AbstractBean<EmployyForm>{ 

    public void calculate(EmployyForm form){ 
     // specific impl 
    } 
} 

ターゲットクラスがされています:ここでは例があるアクティブなプロファイルの

@Service 
    public BaseService{ 

     @Autowire 
     public AbstractBean<AbstractFrom> baseBean; // <- NoSuchBeanDefinitionException 

     // @Autowire 
     // public AbstractBean baseBean; <- Injection works as is expected 
    } 

のDependsだけCompanyBeanまたはEmployeeBean、決して両方を初期化されます。私も豆と私たちと同じ名前を設定してみました@Qualifier注釈。

ダイヤモンド構文を使用してこのBeanを挿入する方法はありますか? Springは特定の依存関係を解決できますか? Spring 4.2.xの使用


編集: 春4.3で可能であるべきです。私はあなたがおそらくAutowireのために、これを好きになるだろうが、なぜ2つの別々の塩基形態にEmployeeFormとCompanyFormを分離した後、BaseServiceにTWOのentiresをしないでされていません知っているJuergen Hoeller's talk

+0

あなたは 'public AbstractBean <? 'をオートワイヤリングしようとしましたか? extends AbstractFrom> baseBean; '? – SimY4

答えて

0

を参照してください。

これは春の回答そのものではありませんが、それがうまくいくかどうかを確認するための素早い回避策として、これは私がやることです。 それらを分けることは、ひどい設計上の妥協ではありません。

+0

それは問題を解決するだろうが、これは私のケースでは解決策ではない。なぜなら、かなり多くのコードを複製しなければならないからだ。保守性の点で、それはより悪い解決策です。とにかくありがとう。 –