2008-11-26 9 views
24

Przeglądam jakiś kod źródłowy i widzę kilka defektów fasoli, które nie mają identyfikatora ani nazwy. Osoba, która to zrobiła, nie jest w pobliżu, aby zapytać. Aplikacja działa poprawnie. Nie jestem zaznajomiony z tym, co to oznacza. Ktoś wie, czy to coś znaczy w szczególności?Fasola sprężynowa bez identyfikatora lub nazwy

+0

Rozważ umieszczenie przykładowej definicji - nie widząc definicji w kontekście, trudno jest dać konkretną odpowiedź. –

+0

Jeśli żadna nazwa nie zostanie podana jawnie, kontener wygeneruje unikalną nazwę dla tego komponentu bean. – lolotron

+4

Domyślnie identyfikator komponentu bean jest generowany przez wielbłądzową nazwę klasy. – lolotron

Odpowiedz

20

Niektóre komponenty bean nie muszą być dostępne dla innych komponentów w pliku kontekstowym lub programowo. Jak wspomniał JacobM, nie wymagają identyfikatora ani imienia, ponieważ nie są do nich przywoływane.

Taki przykład to PropertyPlaceholderConfigurer, który odczytuje plik właściwości, a następnie pozwala na zamianę właściwości środowiska wykonawczego w definicji kontekstu.

Definicja Przykładem może być

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

Javadoc zapewnia dalszą dokumentację na temat tego obiektu, ale w dalszej części pliku można odwołać właściwości z pliku używając tylko średnia szablon zastąpić zastępczy $ {.. .}.

7

Jedną z możliwości jest to, że można zdefiniować komponent bean w miejscu, a więc nie potrzebujesz identyfikatora, ponieważ nie musisz go nigdzie indziej odwoływać. Że mam obiektu Foo, które ma właściwość bar:

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

Bar fasola nie potrzebujesz nazwę, ponieważ jest on używany tylko do ustawiania, że ​​jedna właściwość.

5

Sprawdź możliwość automatycznego okablowania. Inny komponent bean mógłby odwoływać się do nienazwanego komponentu bean, ustawiając właściwość autowire na wartość byType.

To tylko odgadnięcie. Bez konkretnego przykładu nie mogę powiedzieć nic więcej.

1

Do nazwy fasoli bez identyfikatora lub nazwy nadal można się odwoływać. Spring nazywa te fasole automatycznie, używając nazwy klasy i jeśli jest więcej niż jeden komponent tej samej klasy, dodaje do nich liczbę. Ziarna anonimowe są zwykle definiowane wewnątrz znacznika właściwości, ale jeśli są po prostu możliwe, istnieje możliwość skonfigurowania automatycznego konfigurowania w innych komponentach bean. W każdym razie myślę, że dodanie nazwy lub identyfikatora do tych ziaren nie przerwie twojej aplikacji.

1

Jako kilka osób wymienionych powyżej, nie wszystkie fasolki są oparte na nazwie/ID; część opiera się na typie. Na przykład, nie jest to metoda

BeanFactoryUtils.beansOfTypeIncludingAncestors (...)

że chwyta wszystkie fasole jakiegoś danego typu. Jest to używane na przykład przez Spring Web MVC DispatcherServlet (w wielu innych miejscach) do odkrywania fasoli według typów, takich jak HandlerMappings, HandlerAdapters, HandlerExceptionResolvers i tak dalej. Porównaj to z przypadkami, w których komponent bean musi mieć określoną, dobrze znaną nazwę/identyfikator, który można znaleźć, na przykład LocaleResolver (identyfikator musi być "localeResolver" lub nie zostanie znaleziony) i ThemeResolver (identyfikator musi być "themeResolver" lub nie zostanie znaleziony).

1

Ziarna określone bez nazwy i ID mogą być dostępne z wygenerowanym ID (nazwa pakietu i nazwa klasy), na przykład:

fasoli zdefiniowane jako

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

można uzyskać przez

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

// Bean Cfg bez Bean id

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

// mamy dostęp

Object obj = factory.getBean ("com.ds.DemoBe

0

nie jest to obowiązkowe, aby zapewnić java Bean Id..If nie dostarczają Bean Id, nasz Kontener podaje domyślny identyfikator Id.Default Identyfikator fasoli wygląda jak "(Nazwa pakietu). (Nazwa klasy Bean) #N" gdzie N = 0,1,2, ...... itd.

0

Wygląda na to, że istnieje subtelna różnica między nienazwanym i nazwanym zachowaniem fasoli. Jeśli plik konfiguracyjny XML jest importowany dwukrotnie, każdy nazwany komponent bean zostanie utworzony tylko raz, ale nienazwany komponent bean zostanie utworzony tyle razy, ile zawiera jego definicja. Gdy próbuje się skompilować taką fasolę według typu, prowadzi to do takich błędów:

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