私が使うときgetBean("test")
私は次のようなクラスを持っています
@Component
public class TEST {
}
このBeanをロードできますか?
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 {
// ...
}
@ComponentアノテーションはAnnotationBeanNameGeneratorデフォルトで使用し、明示的に名前が指定されていない場合Introspector.decapitalize()、Bean ClassName のメソッドを使用して Bean の名前を取得します。通常、「Test」のような名前のクラスには、Bean 名「test」が付けられます。しかしdecapitalize、好奇心を持っています:
これは通常、最初の文字を大文字から小文字に変換することを意味しますが、複数の文字があり、最初と 2 番目の文字の両方が大文字である (異常な) 特殊なケースでは、そのままにしておきます。
だからあなたclass TESTは Bean name を取得しますTEST。