私は複雑な初期化スキームを持つクラスのセットを持っています。基本的に、私は、私はホールドを取得するために必要なインターフェイスを開始し、コールの束を作る、と私はそのインターフェイスを実装するオブジェクトで終わる。Spring @工場で作られた一般的な豆で@Autowiring
これを処理するために、私はインターフェースを与えられて最終的なオブジェクトを生成できるファクトリクラスを作成しました。私はこのファクトリをBeanにしました。そして、XMLで、さまざまなサービスBeanを、実装するインターフェイスのパラメータでこのファクトリオブジェクトを介してインスタンス化するものとして指定しました。
これは素晴らしいことです。私は完全に正確に必要な豆を手に入れます。残念ながら、私はコントローラのクラスからアクセスしたいと思います。コントローラのクラスは、コンポーネントのスキャンによって発見されます。私はここでは@Autowiredを使用していますが、Springにはどのようなオブジェクトの型がないのかわかりませんが、@Autowiredは型によって動作するため、私はSOLです。
ここで@Resource(name = "beanName")を使用すると完全に動作しますが、一部のBeanでは@Resource、他のBeanでは@Autowiredを使用するのが奇妙に見えます。
各タイプのファクトリメソッドを別にしなくても、これらのBeanごとにどのようなインターフェイスが作成されるかをSpringに知らせる方法はありますか?
私はSpring 2.5.6を使用しています。それ以外の場合は、JavaConfig全体を忘れてしまいます。
ファクトリクラス:
<T extends Client> T buildService(Class<T> clientClass) {
//Do lots of stuff with client class and return an object of clientClass.
}
アプリコンテキスト:
<bean id="serviceFactoryBean" class="com.captainAwesomePants.FancyFactory" />
<bean id="userService" factory-bean="serviceFactoryBean" factory-method="buildService">
<constructor-arg value="com.captain.services.UserServiceInterface" />
</bean>
<bean id="scoreService" factory-bean="serviceFactoryBean" factory-method="buildService">
<constructor-arg value="com.captain.services.ScoreServiceInterface" />
</bean>
私のコントローラ:
public class HomepageController {
//This doesn't work
@Autowired @Qualifier("userService") UserServiceInterface userService;
//This does
@Resource(name="scoreService") ScoreServiceInterface scoreService;
}
私はそれが好きです。私はFactoryBeansから最初は傾いていましたが、正直言って、彼らは私が彼らがしたいものを正確にやることになります。 –
@CaptainAwesomePants:私は自分の 'FactoryBean'実装をできるだけ薄くして、Spring APIを使用しない別のクラスに委譲させます。同じことをすることもできます - 既存の 'serviceFactoryBean'に委譲するだけです。 – skaffman
@skaffman:この場合、リターンタイプのバリエーションの数だけ、多くの「FactoryBean」実装が存在するはずです。 2つの追加メソッドが工場の 'UserServiceInterface buildUserService(){return buildService(UserServiceInterface.class);}に追加された場合、Springは正しい型発見を実行します。 } 'と' ScoreServiceInterface buildScoreService(){buildService(ScoreServiceInterface.class)を返します。 } '(そしてコンテキストは再利用されています)? –