2017-06-06 11 views
0

SpringBootを使用すると、SpringBoot自体によって多くのBeanが暗黙的に作成されます。たとえば、spring-boot-starter-data-redisの依存関係をリンクすると、jedisConnectionFactory beanが自動的に作成されます。SpringのBeanに依存してBeanを定義します。

私が探しているのは、このような暗黙のBeanに依存するカスタムBeanを定義する方法です。 new MyService(jedisConnectionFactory)。問題は、その暗黙のBeanに解決される変数またはメソッドがないことです。

は、今の私は、次の解決策を作ってみた:ApplicationContext.getBean(Class<T>)メソッド呼び出しで必要な豆取得し、その後/別のBeanConfigクラス、autowireを作成し、それにApplicationContextを注入して:

@Bean 
public Transport eventTransport() { 
    final JedisConnectionFactory jedisConnectionFactory = context.getBean(JedisConnectionFactory.class); 
    return new RedisTransport(jedisConnectionFactory.getHostName(), jedisConnectionFactory.getPort()); 
} 

を任意の統合あり内部的に定義されたBeanへの参照を取得する方法は?そこで、ApplicationContextインスタンスを挿入することなく、このbean定義をMyApplicationクラスに移すことができました。 JedisConnectionFactoryクラスはによってインスタンス化されたばかり

+0

'@ Bean'メソッドのメソッド引数として追加するだけです。 'public Transport eventTransport(JedisConnectionFactory接続ファクトリー)'。一般的に言えば、 'ApplicationContext'(または' BeanFactory')に依存してBeanを取得する必要があるときは、間違っています(あなたがフレームワーク/拡張開発者でない場合)。 –

+0

@ M.Deinumはい、私はコンテキストを使用することについてそれを得る、それはなぜ尋ねる:)私はメソッドの引数を定義することが私が探していたものだと思うので、あなたが答えとしてそれを投稿すれば私はそれを受け入れるでしょう。ありがとう! – Scadge

答えて

1

あなたはそれが間違っている(少なくとも単純に春を使用してアプリケーションを開発する際に)やって、あなたは、一般的に言っている豆を得ることがApplicationContextまたはBeanFactoryに頼ら始めた場合。

メソッドに@Beanを使用すると、それらのbeanのファクトリメソッドを効果的に作成する場合、0以上のメソッド引数を使用できます。 (これもreference guideで説明されています)。引数はコンテキストに対して解決され、注入されたBeanを持ちます(見つからない場合は起動に失敗します)。

あなたのケースでは、eventTransportメソッドのメソッド引数としてJedisConnnectionFactory(または多分ConnectionFactoryインターフェイス)を追加することができます。

@Bean 
public Transport eventTransport(final JedisConnectionFactory jedisConnectionFactory) { 
    return new RedisTransport(jedisConnectionFactory.getHostName(), jedisConnectionFactory.getPort()); 
} 

これにより、Beanが既に構築され、完全に使用可能であることを期待するのではなく、Spring間で依存関係を解決することもできます。

+0

ドキュメントリンクのための特別な感謝 - 何とか私はそれを私自身で見つけることができませんでした – Scadge

0

なら、あなたは単にautowireこのクラスレベルのインスタンスとはRedisTransportオブジェクトを作成するために同じを使用することができます。経験則として、まず

@Autowired 
private JedisConnectionFactory jedisConnectionFactory; 

@Bean 
public Transport eventTransport() { 
    return new RedisTransport(jedisConnectionFactory.getHostName(), jedisConnectionFactory.getPort()); 
} 
+3

さらに、メソッドの引数として置くだけで、SpringがBeanの順番をよりよく判断できるようになります。 –

関連する問題