Spring bean без идентификатора или имени - PullRequest
25 голосов
/ 27 ноября 2008

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

Ответы [ 11 ]

23 голосов
/ 28 ноября 2008

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

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

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

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

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

8 голосов
/ 27 ноября 2008

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

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

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

6 голосов
/ 27 ноября 2008

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

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

2 голосов
/ 27 ноября 2008

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

1 голос
/ 10 января 2019

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

Вы не обязаны указывать имя или идентификатор для компонента. Если имя или идентификатор не указаны явно, контейнер генерирует уникальное имя для этого компонента. Однако, если вы хотите ссылаться на этот бин по имени, с помощью элемента ref или поиска в стиле локатора служб, вы должны указать имя. Мотивация отказа от имени связана с использованием внутренних компонентов и соавторов автоматической проводки .

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

Если вы рассматриваете любой боб весны, Spring обязывает его иметь идентификатор. В случае, если вы не предоставили какой-либо идентификатор (через идентификатор или атрибут имени) для 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

1 голос
/ 17 апреля 2014

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

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

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

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

1 голос
/ 14 июля 2013

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

боб определяется как

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

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

TestBean bean = (TestBean) ctx.getBean("pl.finsys.initOrder.TestBeanImpl");
1 голос
/ 30 ноября 2008

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

BeanFactoryUtils.beansOfTypeIncludingAncestors (...)

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

1 голос
/ 28 ноября 2008

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

0 голосов
/ 27 марта 2017

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

No qualifying bean of type [your.class.Name] is defined: expected single matching bean but found 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...