21

私が使うときgetBean("test")

私は次のようなクラスを持っています

@Component
public class TEST {
}

このBeanをロードできますか?

4

2 に答える 2

24

getBean() 大文字と小文字が区別されますが、Spring は@Componentおよび@Beanクラスにカスタム Bean 命名戦略を使用します。4.10.5 自動検出されたコンポーネントの命名を参照してください。

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

そのようなアノテーションにname値が含まれていない場合、または他の検出されたコンポーネント (カスタムフィルターによって検出されたものなど) の場合、デフォルトの Bean 名ジェネレーターは、大文字ではない非修飾クラス名を返します

@Configuration/@Beanについては、 4.12.4.5 Bean の命名のカスタマイズを参照してください。

デフォルトでは、構成クラスは@Beanメソッドの名前を結果の Bean の名前として使用します。ただし、この機能はname属性でオーバーライドできます。

質問に戻ります。クラスが Java 命名規則 (キャメルケース名) に従っていないため、Spring は Bean に珍しい名前を使用しますが、これは機能します。

getBean("TEST")

ただし、予想される命名 ( @Component class Test { }) を使用する場合は、小文字の識別子を使用する必要があります。

getBean("test")

さらに、名前がより複雑な場合は、キャメルケースの構文が適用されます ( Spring のドキュメントを引き続き引用します)。

[...] たとえば、次の 2 つのコンポーネントが検出された場合、名前は と にmyMovieListerなりmovieFinderImplます。

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

@Repository
public class MovieFinderImpl implements MovieFinder {
  // ...
}
于 2012-06-10T08:46:12.323 に答える
11

@ComponentアノテーションはAnnotationBeanNameGeneratorデフォルトで使用し、明示的に名前が指定されていない場合Introspector.decapitalize()、Bean ClassName のメソッドを使用して Bean の名前を取得します。通常、「Test」のような名前のクラスには、Bean 名「test」が付けられます。しかしdecapitalize、好奇心を持っています:

これは通常、最初の文字を大文字から小文字に変換することを意味しますが、複数の文字があり、最初と 2 番目の文字の両方が大文字である (異常な) 特殊なケースでは、そのままにしておきます。

だからあなたclass TESTは Bean name を取得しますTEST

于 2013-03-15T07:06:47.263 に答える