2008-11-26 3 views
24

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

+0

Рассмотрим размещая пример определения - не видя определение в контексте, то трудно дать конкретный ответ. – 2008-11-26 21:49:49

ответ

20

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

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

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

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

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

7

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

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

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

2

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

5

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

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

1

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

1

Как пара людей, упомянутых выше, не все боб-захват основан на имени/ID; некоторые из них основаны на типе. Например, существует метод

BeanFactoryUtils.beansOfTypeIncludingAncestors (...)

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

1

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

фасоли определяется как

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

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

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

// Bean Cfg файла без Bean ID

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

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

объект OBJ = factory.getBean ("com.ds.DemoBe

0

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

0

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

No qualifying bean of type [your.class.Name] is defined: expected single matching bean but found 4 
Смежные вопросы