<content:component-scan ...>
設定のどこかにがあると仮定します。これは、@Component
注釈付きのクラスをインスタンス化しようとします。@Controller
はその@Component
ため、Spring はQueueController
クラスのデフォルトの空のコンストラクターを使用してインスタンス化を試みます。あなたの場合、そのようなコンストラクターは存在しません。したがって、表示されている例外がスローされます。
空のコンストラクターを追加する必要があります
public QueueController() {}
これは、Bean 宣言に関係なく発生します
<bean class="com.xy.web.controllers.QueueController">
<constructor-arg ref="queueServiceImpl"></constructor-arg>
</bean>
QueueController
2 つのインスタンスで終わることになります。これはあなたが望むものではないかもしれません。
IDが原因で発生している動作については、次のとおりです。
アプリケーションコンテキストが を読み取ると、 namecomponent-scan
で を登録します。その後、コンテキストは Bean 宣言に移動します。前の定義に equal を指定したため、オーバーライドされます。クラスの Bean 定義は 1 つだけになります。Bean 宣言には特定の引数を持つコンストラクターが必要であり、それがあるため、文句を言うことはなく、Bean が作成されます。BeanComponentDefinition
queueController
id
QueueController
id
別の 、たとえばを指定した場合abcd
、アプリケーション コンテキストは 2 つの BeanDefinitions を登録しqueueController
ます。あなたが持っていないデフォルトのコンストラクタが必要です。したがって、例外が発生します。component-scan
abcd
<bean>
queueController
より詳細な
を使用している場合は、メソッドの次の呼び出しClassPathXmlApplicationContext
を見てくださいClassPathBeanDefinitionScanner#doScan(String...)
String beanName = this.beanNameGenerator.generateBeanName(candidate, this.registry);
はのbeanNameGenerator
インスタンスですAnnotationBeanNameGenerator
。それは最終的に呼び出します
// Fallback: generate a unique default bean name.
return buildDefaultBeanName(definition, registry);
呼び出す
String shortClassName = ClassUtils.getShortName(definition.getBeanClassName());
return Introspector.decapitalize(shortClassName);
デフォルトの名前を返しますqueueController
。それはあなたがid
オーバーライドしているものです。
これは実際にログで確認できます。
Mon Aug 26 12:12:15 EDT 2013 [main] INFO o.s.b.f.s.DefaultListableBeanFactory - Overriding bean definition for bean 'queueController': replacing [Generic bean: class [org.test.QueueController]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [C:\Users\sotirios.delimanolis\git\content-store\target\test-classes\org\test\QueueController.class]] with [Generic bean: class [org.test.QueueController]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [app.xml]]