RedisConfigurationでRedisTemplate<Long, Permission>
,RedisTemplate<Long, Order>
などのBeanを宣言しました。デフォルトでは 以下のコードショー、どのようにSpringは一致したBeanを見つけますか?
@Bean
public RedisTemplate<String, Order> orderRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Order> redisTemplate = new RedisTemplate<>();
configure(redisTemplate, redisConnectionFactory);
return redisTemplate;
}
@Bean
public RedisTemplate<String, Permission> permissionRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Permission> redisTemplate = new RedisTemplate<>();
configure(redisTemplate, redisConnectionFactory);
return redisTemplate;
}
、宣言された名前の名前が宣言されたメソッドの名前です。 今、私はTestControllerに@Autowiredという注釈が付けられたフィールドを宣言するテストコードを書いています。 テストコードは、次のように
@Autowired
RedisTemplate<String, Permission> permissionTemplate;
はその後、私はTestControllerにアクセスします。それは正常に働いた。 しかし、私はテストで質問があります。 SpringがRedisConfigurationで宣言されたBeanを見つけて、permissionTemplateにファイルを割り当てる方法を教えてください。 わかっているように、ジェネリック型はJavaコンパイル時には で削除されているため、SpringはGeneric Typeで正しいBeanを見つけることは不可能です。 次の可能性は、SpringがfiledNameによって宣言されたBeanを見つけることです。 私の提案を承認するために、私は次のようにTestControllerのファイルを修正しました。
@Autowired
RedisTemplate<String, Permission> orderTemplate;
次に、私はTestControllerを要求しました。それはまたうまくいった。このテストは、SpringがGeneric Typeを使用して一致するBeanを見つけることを示しています。
SpringはpermissionTemplateのジェネリック型をどのように知っていますか?
はいそこ型消去、*はされますが、*型情報がまだメソッドシグネチャに保存されています。 IIRC Springは、getter/setterメソッドのシグネチャを使用して、プロパティの型paramを認識し、自動配線に使用します。だから、あなたの 'TestController'では、対応するゲッターを追加すると動作するはずです。 –
こんにちは、あなたのコメントです。投稿した前の質問は間違っていたので、私は質問を修正しました。私の問題をもう一度見てもらえますか?本当にありがとう。 – Iconoclast
私には同じ答え:属性のgetter/setterがあると思います。Springはgetter/setterのシグネチャからジェネリック型の情報を取得します。 (btw、 'RedisTemplate orderTemplate;そうでしょうか?) –