Почему только MessageSource разрешен в качестве идентификатора компонента для ResourceBundleMessageSource?

#java #spring

#java #весна

Вопрос:

Для компонентов обычно мы можем настроить атрибут id, но для класса ResourceBundleMessageSource, если мы не указываем id=»MessageSource», тогда генерируется исключение.

 <bean id="myMessageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="message" />
</bean>
  

Он выдает исключение

 Exception in thread "main" org.springframework.context.NoSuchMessageException: 
  

для кода

 new ClassPathXmlApplicationContext("springconfig.xml").getMessage("code");
  

Комментарии:

1. Хороший вопрос, из-за которого я несколько часов дергал себя за волосы!

Ответ №1:

Короткий ответ — потому что так они его разработали.

Как описано в справочном руководстве:

Когда ApplicationContext загружается, он автоматически выполняет поиск MessageSource компонента, определенного в контексте. Компонент должен иметь имя messageSource .Если такой компонент найден, все вызовы предыдущих методов делегируются источнику сообщения…. Если ApplicationContext не удается найти какой-либо источник для сообщений, DelegatingMessageSource создается экземпляр empty, чтобы иметь возможность принимать вызовы методов, определенных выше.

Это просто жестко запрограммированное значение, которое ищется. Если вы не предоставите компонент с этим именем, вы получите DelegatingMessageSource экземпляр, который не разрешит ни одно из ваших сообщений, предоставляя вам NoSuchMessageException .

Ответ №2:

Выдержка из документации:

Когда загружается ApplicationContext, он автоматически выполняет поиск компонента MessageSource, определенного в контексте. Компонент должен иметь имя MessageSource. Если такой компонент найден, все вызовы предыдущих методов делегируются источнику сообщения. Если источник сообщения не найден, ApplicationContext пытается найти родительский компонент, содержащий компонент с тем же именем. Если это так, он использует этот компонент в качестве источника сообщений. Если ApplicationContext не может найти какой-либо источник для сообщений, создается экземпляр пустого DelegatingMessageSource, чтобы иметь возможность принимать вызовы методов, определенных выше.