Бин Spring без идентификатора или имени

Я просматриваю некоторый код Spring и вижу несколько определений bean-компонентов, у которых нет идентификатора или имени. Человека, который это сделал, нет рядом, чтобы спросить. Приложение работает нормально. Я не знаю, что это обязательно означает. Кто-нибудь знает, означает ли это что-нибудь конкретное?

Подумайте о том, чтобы опубликовать пример определения - не видя определения в контексте, трудно дать конкретный ответ.

Ken Gentle 27.11.2008 00:49

Если имя не указано явно, контейнер сгенерирует уникальное имя для этого bean-компонента.

Marko Vranjkovic 22.05.2013 14:31

По умолчанию идентификатор компонента будет сгенерирован путем заключения имени класса в верблюжий регистр.

Marko Vranjkovic 24.05.2013 17:16
26
3
29 295
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Одна из возможностей заключается в том, что вы можете определить bean-компонент на месте, и поэтому вам не нужен идентификатор, поскольку вам не нужно ссылаться на него из любого другого места. Скажем, у меня есть объект Foo, который принимает свойство Bar:

<bean id = "foo" class = "Foo">
     <property name = "bar">
         <bean class = "Bar">
     </property>
</bean>

Компоненту Bar не нужно имя, потому что он используется только для установки этого свойства.

Атрибуты id и name являются необязательными и используются для ссылки на определение компонента из других определений. Посмотрите официальная документация Spring для более подробной информации.

Проверить возможность автоподвода. Другой bean-компонент может ссылаться на безымянный bean-компонент, если для свойства autowire установлено значение byType.

Это всего лишь предположение. Без конкретного примера я ничего не могу сказать.

Ответ принят как подходящий

Некоторые bean-компоненты не обязательно должны быть доступны другим bean-компонентам в контекстном файле или программно. Итак, как упоминал JacobM, они не требуют идентификатора или имени, поскольку на них нет ссылок.

Таким примером может быть PropertyPlaceholderConfigurer, который читает файл свойств, а затем разрешает замену свойств во время выполнения в определении контекста.

Пример определения будет

<bean class = "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name = "location" value = "myapp.properties" />
</bean>

JavaDoc предоставляет дополнительную документацию по этому объекту, но далее в файле вы можете ссылаться на свойства из вашего файла, просто используя стандартный шаблон замены заполнителя $ {...}.

Итак, когда будет создан этот класс?

Parasu 26.04.2018 23:24

На bean-компоненты без идентификатора или имени по-прежнему можно ссылаться по имени класса. Spring автоматически называет эти bean-компоненты, используя имя класса, и, если существует более одного bean-компонента одного и того же класса, он добавляет к ним номер. Анонимные bean-компоненты обычно определяются внутри тега свойств, но если они просто там, возможно, в некоторых других bean-компонентах настроено автоматическое подключение. В любом случае, я думаю, что добавление имени или идентификатора к этим bean-компонентам не сломает ваше приложение.

Как упомянули несколько человек выше, не весь захват bean-компонентов основан на имени / идентификаторе; некоторые из них основаны на типе. Например, есть метод

BeanFactoryUtils.beansOfTypeIncludingAncestors (...)

который захватывает все бобы определенного типа. Это используется, например, в Spring Web MVC DispatcherServlet (среди многих других мест) для обнаружения компонентов по типу, таких как HandlerMappings, HandlerAdapters, HandlerExceptionResolvers и т. д. Сравните это со случаями, когда bean-компонент должен иметь конкретное хорошо известное имя / идентификатор для поиска, например LocaleResolver (идентификатор должен быть localeResolver, иначе он не будет найден) и ThemeResolver (идентификатор должен быть themeResolver или не будет найдено).

Компоненты, определенные без имени и идентификатора, могут быть доступны по сгенерированному идентификатору (полное имя пакета и имя класса), например:

bean-компонент, определенный как

<bean class = "pl.finsys.initOrder.TestBeanImpl">

можно получить доступ

TestBean bean = (TestBean) ctx.getBean("pl.finsys.initOrder.TestBeanImpl");

// Файл Bean Cfg без идентификатора Bean

<bean class = "com.ds.DemoBean"> <property name = "msg" value = "Hello"/> </bean>

// Мы можем получить доступ

Объект obj = factory.getBean ("com.ds.DemoBe

это не является обязательным для предоставления идентификатора Java Bean Id. Если мы не предоставляем Bean Id, наш Контейнер предоставляет идентификатор Been Id по умолчанию. Идентификатор Bean Id по умолчанию выглядит как «(Имя пакета). (Имя класса компонента) #N», где N = 0,1,2, ...... и т. д.

Кажется, есть тонкая разница между поведением безымянного и именованного bean-компонента. Если у вас есть файл конфигурации XML, импортированный дважды, каждый именованный компонент будет создан только один раз, но безымянный компонент будет создаваться столько раз, сколько включено его определение. При попытке автоматического подключения такого bean-компонента по типу это приводит к следующим ошибкам:

No qualifying bean of type [your.class.Name] is defined: expected single matching bean but found 4

взгляните на https://docs.spring.io/spring/docs/4.3.12.RELEASE/spring-framework-reference/htmlsingle/#beans-beanname, там написано:

You are not required to supply a name or id for a bean. If no name or id is supplied explicitly, the container generates a unique name for that bean. However, if you want to refer to that bean by name, through the use of the ref element or Service Locator style lookup, you must provide a name. Motivations for not supplying a name are related to using inner beans and autowiring collaborators.

Кроме того, такие компоненты, как BeanPostProcessor, BeanFactoryPostProcessor и PropertyPlaceholderConfigurer, автоматически обнаруживаются контекстом приложения и обычно не имеют имени.

Если вы рассматриваете любой Spring bean-компонент, Spring требует, чтобы он имел идентификатор. В случае, если вы не указали какой-либо идентификатор (через атрибут id или name) для bean-компонента в своей конфигурации, вы не столкнетесь с исключениями. Spring справится с такой ситуацией, назначив идентификатор по умолчанию. у него есть BeanNameGenerator для назначения имени по умолчанию. <bean class = "com.package.name.TestBean"> будет называться "com.package.name.TestBean". Тип bean-компонента @Bean будет иметь имя метода как имя bean-компонента.

таким образом, в вашем коде по какой-то причине вы можете пропустить именование нескольких bean-компонентов, и код по-прежнему работает, если вы обращаетесь к этим bean-компонентам с их именем по умолчанию

кредиты: https://www.javacodegeeks.com/2013/02/spring-bean-names.html

Другие вопросы по теме