私が使うとき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
。