对于Beans,通常我们可以自定义id属性,但对于ResourceBundleMessageSource类,如果我们不指定id ="messageSource",则抛出异常.
<bean id="myMessageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="message" />
</bean>
Run Code Online (Sandbox Code Playgroud)
它抛出异常
Exception in thread "main" org.springframework.context.NoSuchMessageException:
Run Code Online (Sandbox Code Playgroud)
代码
new ClassPathXmlApplicationContext("springconfig.xml").getMessage("code");
Run Code Online (Sandbox Code Playgroud)
简短回答 - 因为这是他们设计的方式.
如参考指南中所述:
当
ApplicationContext被加载时,它自动搜索MessageSource在上下文中定义的bean.bean必须具有名称messageSource.如果找到这样的bean,则对前面方法的所有调用都被委托给消息源....如果ApplicationContext找不到消息的任何源,DelegatingMessageSource则实例化为空以便能够接受对上面定义的方法的调用.
这只是一个搜索的硬编码值.如果您没有提供具有该名称的bean,那么您最终将得到一个DelegatingMessageSource无法解析任何消息的实例,从而为您提供NoSuchMessageException.