複雑な初期化スキームを持つ一連のクラスがあります。基本的に、取得する必要のあるインターフェイスから始めて、一連の呼び出しを行い、最終的にそのインターフェイスを実装するオブジェクトを作成します。
これを処理するために、インターフェイスを指定して最終的なオブジェクトを生成できるファクトリ クラスを作成しました。このファクトリを Bean にし、さまざまなサービス Bean を、実装するインターフェイスのパラメータを使用して、このファクトリ オブジェクトを介してインスタンス化されるように XML で指定しました。
これはうまく機能し、必要な豆を完全に手に入れることができます。残念ながら、コンポーネントのスキャンによって発見されたコントローラー クラスからそれらにアクセスしたいと考えています。ここで @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;
}