2016-11-14 7 views
0

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のジェネリック型をどのように知っていますか?

+0

はいそこ型消去、*はされますが、*型情報がまだメソッドシグネチャに保存されています。 IIRC Springは、getter/setterメソッドのシグネチャを使用して、プロパティの型paramを認識し、自動配線に使用します。だから、あなたの 'TestController'では、対応するゲッターを追加すると動作するはずです。 –

+0

こんにちは、あなたのコメントです。投稿した前の質問は間違っていたので、私は質問を修正しました。私の問題をもう一度見てもらえますか?本当にありがとう。 – Iconoclast

+0

私には同じ答え:属性のgetter/setterがあると思います。Springはgetter/setterのシグネチャからジェネリック型の情報を取得します。 (btw、 'RedisTemplate orderTemplate;そうでしょうか?) –

答えて

1

はいJavaジェネリックのタイプ消去がありますが、Field、戻り値の型およびメソッドのパラメータのような多くのシナリオでは、ジェネリック型の情報がまだバイトコードに存在します。 Springはこれらの情報を使用してジェネリック型情報を決定し、したがってBean型のマッチングを行います。一般的な情報は、実行時に利用可能であることの

デモンストレーション:

import java.lang.reflect.*; 
public class Foo { 
    private List<String> fooField; 

    public static void main(String[] args) throws Exception{ 
     for (Field f : Foo.class.getDeclaredFields()) { 
      if (f.getName().equals("fooField")) { 
       System.out.println("Generic Types " + f.getGenericType()); 
       break; 
      } 
     } 
    } 
} 

あなたは出力が表示されます。

Generic Types java.util.List<java.lang.String> 
+0

ありがとう、私は本当に再びJavaの基礎知識を勉強する必要があります。 – Iconoclast

+0

あなたを歓迎します。私はそれを "基本的な"知識とは考えません:p私は個人的に忘れてしまったフィールドはまた、最初の場所に保存されたジェネリックなタイプの情報を持っています:P –

関連する問題