Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

BeanFactoryUtils.beansOfTypeIncludingAncestors(...)

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

Ответ 7

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

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

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

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

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

Ответ 8

//Bean Файл Cfg без Bean id

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

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

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

Ответ 9

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

Ответ 10

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

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

Ответ 11

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

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

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

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

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

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