2012-06-10 9 views

答えて

15

getBean()敏感場合である、しかし春は@Component@Beanクラスのカスタム豆の命名戦略を使用しています。 4.10.5 Naming autodetected componentsを参照してください

成分がスキャンプロセスの一部として自動検出された場合、そのBean名がBeanNameGenerator戦略[...]によって生成されます。デフォルトでは、nameの値を含むSpringステレオタイプ注釈(@Component@Repository、、および@Controller)は、対応するBean定義にその名前を提供します。

は、このような注釈にはname値が含まれていない場合、または(などカスタムフィルタによって発見されたものなど)、他の検出されたコンポーネントに対して、デフォルトBean名ジェネレータはuncapitalized非修飾クラス名を返します。

そして4.12.4.5 Customizing bean namingを参照してください@Configuration/@Bean用:

デフォルトでは、設定クラスは、得られたBeanの名前として@Beanメソッドの名前を使用します。ただし、この機能は、name属性で上書きすることができます。

に戻る。あなたのクラスは、Javaの命名規則(キャメルケースの名前)春は、Beanの珍しい名前を使用して、これは動作します、次のされていないので:

getBean("TEST") 

しかし、あなたが期待される命名(@Component class Test { })を使用する場合は、小文字を使用する必要があります。識別子:あなたの名前が、より複雑な場合

getBean("test") 

はまた、uncapitalizedキャメルケースの構文は(Spring documentationを引用し続けて)適用されます。

[...]以下の2つの成分が検出された場合たとえば、名前がmyMovieListermovieFinderImpl次のようになります。

@Service("myMovieLister") 
public class SimpleMovieLister { 
    // ... 
} 

@Repository 
public class MovieFinderImpl implements MovieFinder { 
    // ... 
} 
+0

ありがとうTomasz。それは私の期待以上に複雑です。私のクラスが@ComponentクラスのTestTreeのようなものなら、getBean( "testTree")を使ってロードできますか? – user496949

+0

@ user496949:正確に。実際には複雑ではありません。 'TestTree'型のクラスを保持する変数にはおそらく同じ名前を使用します。さらに、現在、静的に型付けされた 'getBean(TestTree.class)'を使用するべきです –

3

@Component注釈が明示的に名前を与えられていない場合は、BeanのIntrospector.decapitalize()メソッドを使用しますが、デフォルトでAnnotationBeanNameGeneratorを使用していますClassNameを使用してBeanの名前を取得します。通常、 "Test"のような名前のクラスは、それにbean名 "test"を与えます。しかし、好奇心decapitalize有する:

これは通常 に大文字から小文字の最初の文字を変換する手段が、(異常な)特殊なケースで複数 一文字と第1および第2の両方の文字がある場合大文字で、 私たちはそれを残す。

あなたのclass TESTは、Bean名TESTを取得します。

関連する問題